无法使用 update-alternatives --install 安装 jdk11

Mr.*_*ong 8 openjdk update-alternatives

为了试用 jdk11 的新功能,我将其安装到 /opt/ 并希望使用更新替代品来使用它,如下所示:

sudo update-alternatives --install /etc/alternatives/java OpenJDK-11 /opt/jdk-11/bin/java 1102
Run Code Online (Sandbox Code Playgroud)

返回:

update-alternatives: using /opt/jdk-11/bin/javac to provide /etc/alternatives/java (OpenJDK-11) in auto mode
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时

$ sudo update-alternatives --config java
Run Code Online (Sandbox Code Playgroud)

我没有看到我刚刚安装的jdk。相反,我收到警告和已经存在的选择:

update-alternatives: warning: /etc/alternatives/java has been changed (manually or by a script); switching to manual updates only
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1101      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1101      manual mode
  2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode
Run Code Online (Sandbox Code Playgroud)

警告是什么意思,为什么它实际上同时显示自动和手动模式条目?为什么我的 jdk11 不在那里?

sol*_*iCe 9

我想你的第一个命令是错误的;它应该是:

sudo update-alternatives /usr/bin/java java /opt/jdk-11/bin/java 1102
Run Code Online (Sandbox Code Playgroud)

对于 jdk 的所有其他可执行文件也是如此。

怎么做

安装 jdk-11

首先将 jdk-11 安装在/usr/lib/jvm. 我们将openjdk-11+28-amd64在这里使用

创建一个 shell 脚本来自动更新备选方案

我叫它 jdk-11.sh

sudo update-alternatives /usr/bin/java java /opt/jdk-11/bin/java 1102
Run Code Online (Sandbox Code Playgroud)

然后使jdk-11.sh可执行文件,并运行

sudo ./jdk-11.sh -i
Run Code Online (Sandbox Code Playgroud)

为新的 jdk-11 添加替代品

切换到这个 jdk-11

然后在帮助下切换到该替代方案 update-java-alternatives

我们需要一个名为.openjdk-11+28.jinfoinside的帮助文件/usr/lib/jvm

name=openjdk-11+28-amd64
alias=openjdk-11+28-amd64
priority=1102
section=main

hl rmid /usr/lib/jvm/openjdk-11+28-amd64/bin/rmid
hl java /usr/lib/jvm/openjdk-11+28-amd64/bin/java
hl keytool /usr/lib/jvm/openjdk-11+28-amd64/bin/keytool
hl jjs /usr/lib/jvm/openjdk-11+28-amd64/bin/jjs
hl pack200 /usr/lib/jvm/openjdk-11+28-amd64/bin/pack200
hl rmiregistry /usr/lib/jvm/openjdk-11+28-amd64/bin/rmiregistry
hl unpack200 /usr/lib/jvm/openjdk-11+28-amd64/bin/unpack200
hl jexec /usr/lib/jvm/openjdk-11+28-amd64/lib/jexec
jdkhl jlink /usr/lib/jvm/openjdk-11+28-amd64/bin/jlink
jdkhl jdeps /usr/lib/jvm/openjdk-11+28-amd64/bin/jdeps
jdkhl rmic /usr/lib/jvm/openjdk-11+28-amd64/bin/rmic
jdkhl jinfo /usr/lib/jvm/openjdk-11+28-amd64/bin/jinfo
jdkhl jstat /usr/lib/jvm/openjdk-11+28-amd64/bin/jstat
jdkhl javac /usr/lib/jvm/openjdk-11+28-amd64/bin/javac
jdkhl jhsdb /usr/lib/jvm/openjdk-11+28-amd64/bin/jhsdb
jdkhl jps /usr/lib/jvm/openjdk-11+28-amd64/bin/jps
jdkhl jstack /usr/lib/jvm/openjdk-11+28-amd64/bin/jstack
jdkhl jrunscript /usr/lib/jvm/openjdk-11+28-amd64/bin/jrunscript
jdkhl javadoc /usr/lib/jvm/openjdk-11+28-amd64/bin/javadoc
jdkhl jmod /usr/lib/jvm/openjdk-11+28-amd64/bin/jmod
jdkhl javap /usr/lib/jvm/openjdk-11+28-amd64/bin/javap
jdkhl jar /usr/lib/jvm/openjdk-11+28-amd64/bin/jar
jdkhl jaotc /usr/lib/jvm/openjdk-11+28-amd64/bin/jaotc
jdkhl jshell /usr/lib/jvm/openjdk-11+28-amd64/bin/jshell
jdkhl jmap /usr/lib/jvm/openjdk-11+28-amd64/bin/jmap
jdkhl jdeprscan /usr/lib/jvm/openjdk-11+28-amd64/bin/jdeprscan
jdkhl jimage /usr/lib/jvm/openjdk-11+28-amd64/bin/jimage
jdkhl jstatd /usr/lib/jvm/openjdk-11+28-amd64/bin/jstatd
jdkhl jdb /usr/lib/jvm/openjdk-11+28-amd64/bin/jdb
jdkhl serialver /usr/lib/jvm/openjdk-11+28-amd64/bin/serialver
jdkhl jcmd /usr/lib/jvm/openjdk-11+28-amd64/bin/jcmd
jdkhl jarsigner /usr/lib/jvm/openjdk-11+28-amd64/bin/jarsigner
jdk jconsole /usr/lib/jvm/openjdk-11+28-amd64/bin/jconsole
Run Code Online (Sandbox Code Playgroud)

然后运行

sudo update-java-alternatives -s openjdk-11+28-amd64
Run Code Online (Sandbox Code Playgroud)

回滚到 ubuntu 包

sudo update-java-alternatives -s java-1.11.0-openjdk-amd64
sudo ./jdk-11.sh -r # optionnal
sudo rm -rf /usr/lib/jvm/openjdk-11+28-amd64 # optionnal
Run Code Online (Sandbox Code Playgroud)