update-java-alternatives与update-alternatives --config java的区别

在Ubuntu 12.04 LTS上,我已经安装了Sun的JDK7、Eclipse和Arduino IDE。我希望Arduino使用OpenJDK 6,并且希望Eclipse使用Sun的JDK 7。
据我所知,在运行每个应用程序之前,我需要手动选择要使用的Java版本。这使我想到了update-java-alternatives -l命令。当我运行该命令时,我只看到以下内容:
java-1.6.0-openjdk-amd64 1061 /usr/lib/jvm/java-1.6.0-openjdk-amd64

但是当我运行update-alternatives --config java时,我看到以下内容:
*0  /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   auto mode
1  /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   manual mode
2  /usr/lib/jvm/jdk1.7.0/bin/java                   manual mode
3  /usr/lib/jvm/jre1.7.0/bin/java                   manual mode

我不明白为什么update-java-alternatives没有显示相同的3个选项。我也不明白如何在OpenJDK6和JDK7之间切换。我应该如何使用OpenJDK6进行Arduino开发,以及使用Sun JDK7进行Eclipse/Android开发?
4个回答

sudo update-alternatives --config java

配置程序“java”的默认选项。这是Java虚拟机。

sudo update-alternatives --config javac

配置默认的Java编译器。

你还可以看到,因为第一个命令列出了许多“JRE”(Java运行环境)文件夹,而程序只被称为“java”。

如果我通过输入命令java -versionjavac -version来检查正在使用的版本,我可以看到每个命令都会更改正在使用的程序。

然而,使用update-java-alternatives与JDK版本一起更改两个程序。使用第一个命令,您可以从不同的JDK中使用Java虚拟机和Java编译器。

update-java-alternatives需要在目录/usr/lib/jvm中存在一个扩展名为.jinfo的文件。opendjk软件包附带了一个.jinfo文件,Oracle(以前是Sun)的jdk没有。作为替代,您可以在不使用update-java-alternatives的情况下配置备选项

例如,要从jvm目录/usr/lib/jvm/jdk-12.0.1(Oracle的Debian软件包的默认目录)添加Java,并设置优先级为2082,请使用以下命令:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-12.0.1/bin/java 2082
至于切换不同的开发环境:
你是指在IDE中启动不同的Java版本还是在IDE中使用不同版本进行编译和运行应用程序?
对于第一种情况:你可以在eclipse.ini中指定要使用的JVM,如此处所述。我不知道如何在Arduino IDE中做到这一点。
对于第二种情况:在Eclipse中,您可以在窗口 -> 首选项 -> Java -> 已安装的JRE中选择要使用的JRE/JDK。并且在Java -> 编译器下,如果需要,您可以选择较旧的Java兼容性。
编辑: 这个DigitalOcean页面还有一个非常好的关于在Ubuntu上使用Java的解释。

update-java-alternatives 是一个用于更新 jre/jdk 安装的替代方案的程序。

update-alternatives 是 Linux 上的一个符号链接管理系统(我相信这里没有什么新闻)。

你可以,而且真的应该,同时使用 update-java-alternativesupdate-alternatives

首先,请确保所有的替代方案都配置正确。java 和 javac 只是其中几个。还有 javadocrmicserialver 等等,将上述变量替换为:native2ascii/opt/jdk1.8.0_40/bin/native2ascii 应该会报告替代方案是否已安装和/或已选择。

当所有的替代方案都配置好后,你可以在 /usr/lib/jvm 中创建到你手动安装的链接。

为了配置 update-java-alternatives,你必须使用与你的目录同名但以 .(点)为前缀的隐藏文件。

希望这对你有所帮助。

参考文献

man -S 8 update-java-alternatives

http://tech.lanesnotes.com/2008/03/using-alternatives-in-linux-to-use.html

https://stackoverflow.com/questions/6477415/how-to-set-oracles-java-as-the-default-java-in-ubuntu


3当我运行update-java-alternatives命令时,它会更新/etc/alternatives目录下的符号链接。因此,你不需要同时运行两个命令。 - dan carter

只是一个小提示(太长了,不适合作为评论)。如果你需要自动地切换到Java 8(编译器1.8),例如对于脚本或持续集成测试套件,你可以运行以下命令。
sudo update-java-alternatives -s $(sudo update-java-alternatives -l | grep '1\.8' | cut -d " " -f1) || echo '.'

它将自动获取任何可用的Java 8版本,并使用命令update-java-alternatives进行设置。

末尾的|| echo '.'只是确保命令返回成功,因为奇怪的是,默认情况下update-java-alternatives会返回错误(1)。如果您不需要测试套件中的此功能,则可以跳过它。


我已经检查了/usr/sbin/update-java-alternatives的内容,它只是一个调用update-alternatives的脚本,用于处理文件/usr/lib/jvm/.<jname>.jinfo中的每个条目。
如果你在新的JDK安装中没有这样的文件,你可以按照以下步骤创建自己的安装脚本。 假设你刚刚通过Debian软件包在Ubuntu上安装了JDK 17,并且你有以下现有情况:
$ update-alternatives --config java

There are 3 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-8-oracle/jre/bin/java          1081      auto mode
  1            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode
* 2            /usr/lib/jvm/java-8-oracle/jre/bin/java          1081      manual mode
  3            /usr/lib/jvm/jdk-13.0.2/bin/java                 1081      manual mode
^CTRL-C

创建以下脚本:
$ sudo nano jdk-17.0.6.install-alternatives.sh 

请使用以下内容,确保根据您系统的配置替换正确的值到 JAVADIRPRIORITYBINDIR 变量中:
#!/bin/bash

JAVADIR=/usr/lib/jvm/jdk-17
PRIORITY=1081
BINDIR=/usr/bin
find "$JAVADIR" -perm 755 -type f | while read FP
do
  FN=$(basename $FP)
  echo "update-alternatives --install /usr/bin/$FN $FN $FP $PRIORITY"
  update-alternatives --install /usr/bin/$FN $FN $FP $PRIORITY
done

这将选择您的新Java包中的所有可执行文件,即使这些文件位于与 bin/(即 lib/)不同的目录下。

将脚本设置为可执行:

$ chmod 755 jdk-17.0.6.install-alternatives.sh

然后以root身份运行它:
$ sudo ./jdk-17.0.6.install-alternatives.sh 
update-alternatives --install /usr/bin/jspawnhelper jspawnhelper /usr/lib/jvm/jdk-17/lib/jspawnhelper 1081
update-alternatives --install /usr/bin/jexec jexec /usr/lib/jvm/jdk-17/lib/jexec 1081
update-alternatives --install /usr/bin/keytool keytool /usr/lib/jvm/jdk-17/bin/keytool 1081
update-alternatives --install /usr/bin/jmod jmod /usr/lib/jvm/jdk-17/bin/jmod 1081
update-alternatives --install /usr/bin/jimage jimage /usr/lib/jvm/jdk-17/bin/jimage 1081
update-alternatives --install /usr/bin/jstat jstat /usr/lib/jvm/jdk-17/bin/jstat 1081
update-alternatives --install /usr/bin/jdb jdb /usr/lib/jvm/jdk-17/bin/jdb 1081
update-alternatives --install /usr/bin/jstack jstack /usr/lib/jvm/jdk-17/bin/jstack 1081
update-alternatives --install /usr/bin/jcmd jcmd /usr/lib/jvm/jdk-17/bin/jcmd 1081
update-alternatives --install /usr/bin/serialver serialver /usr/lib/jvm/jdk-17/bin/serialver 1081
update-alternatives --install /usr/bin/jinfo jinfo /usr/lib/jvm/jdk-17/bin/jinfo 1081
update-alternatives --install /usr/bin/jps jps /usr/lib/jvm/jdk-17/bin/jps 1081
update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-17/bin/java 1081
update-alternatives --install /usr/bin/jhsdb jhsdb /usr/lib/jvm/jdk-17/bin/jhsdb 1081
update-alternatives --install /usr/bin/jlink jlink /usr/lib/jvm/jdk-17/bin/jlink 1081
update-alternatives --install /usr/bin/jstatd jstatd /usr/lib/jvm/jdk-17/bin/jstatd 1081
update-alternatives --install /usr/bin/jdeprscan jdeprscan /usr/lib/jvm/jdk-17/bin/jdeprscan 1081
update-alternatives --install /usr/bin/jshell jshell /usr/lib/jvm/jdk-17/bin/jshell 1081
update-alternatives --install /usr/bin/jdeps jdeps /usr/lib/jvm/jdk-17/bin/jdeps 1081
update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/jdk-17/bin/jar 1081
update-alternatives --install /usr/bin/jfr jfr /usr/lib/jvm/jdk-17/bin/jfr 1081
update-alternatives --install /usr/bin/jarsigner jarsigner /usr/lib/jvm/jdk-17/bin/jarsigner 1081
update-alternatives --install /usr/bin/javadoc javadoc /usr/lib/jvm/jdk-17/bin/javadoc 1081
update-alternatives --install /usr/bin/jpackage jpackage /usr/lib/jvm/jdk-17/bin/jpackage 1081
update-alternatives: using /usr/lib/jvm/jdk-17/bin/jpackage to provide /usr/bin/jpackage (jpackage) in auto mode
update-alternatives --install /usr/bin/jmap jmap /usr/lib/jvm/jdk-17/bin/jmap 1081
update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk-17/bin/javac 1081
update-alternatives --install /usr/bin/jconsole jconsole /usr/lib/jvm/jdk-17/bin/jconsole 1081
update-alternatives --install /usr/bin/javap javap /usr/lib/jvm/jdk-17/bin/javap 1081
update-alternatives --install /usr/bin/rmiregistry rmiregistry /usr/lib/jvm/jdk-17/bin/rmiregistry 1081
update-alternatives --install /usr/bin/jrunscript jrunscript /usr/lib/jvm/jdk-17/bin/jrunscript 1081

现在你对上面列出的所有可执行文件都有了以下更新的情况:
$ update-alternatives --config java
There are 4 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-8-oracle/jre/bin/java          1081      auto mode
  1            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode
* 2            /usr/lib/jvm/java-8-oracle/jre/bin/java          1081      manual mode
  3            /usr/lib/jvm/jdk-13.0.2/bin/java                 1081      manual mode
  4            /usr/lib/jvm/jdk-17/bin/java                     1081      manual mode

Press <enter> to keep the current choice[*], or type selection number:

^CTRL-C

$ update-alternatives --config jshell
There are 2 choices for the alternative jshell (providing /usr/bin/jshell).

  Selection    Path                                Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/jdk-13.0.2/bin/jshell   1081      auto mode
  1            /usr/lib/jvm/jdk-13.0.2/bin/jshell   1081      manual mode
  2            /usr/lib/jvm/jdk-17/bin/jshell       1081      manual mode

Press <enter> to keep the current choice[*], or type selection number: ^C

$ update-alternatives --config jpackage
There is only one alternative in link group jpackage (providing /usr/bin/jpackage): /usr/lib/jvm/jdk-17/bin/jpackage
Nothing to configure.

^CTRL-C

等等。