update-java-alternatives 与 update-alternatives --config java

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 开发?

答案1

sudo update-alternatives --config java

配置程序“java”的默认值。即 Java VM。

sudo update-alternatives --config javac

配置默认 Java 编译器。

您还可以看到,因为第一个命令列出了很多“JRE”(Java 运行时环境)文件夹,而该程序仅名为“java”。

如果我通过发出命令 java -version 或来 检查正在使用哪个版本javac -version,我可以看到每个命令都会改变正在使用的程序。

但是,使用update-java-alternativesJDK 版本会发生变化两个都对我来说,这是个不错的程序。使用第一个命令,您可以使用来自不同 JDK 的 Java VM 和 Java 编译器。

update-java-alternatives.jinfo要求目录中存在扩展名为 的文件/usr/lib/jvmopenjdk软件包附带一个.jinfo文件,而 Oracle(以前称为 Sun)的 jdk 则不附带。作为替代方案,您可以配置替代方案而不update-java-alternatives

例如,从 jvm-directory 添加 java /usr/lib/jvm/jdk-12.0.1(Debian Oracle软件包的默认目录),优先级为2082,使用以下命令:

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-12.0.1/bin/java 2082

至于切换不同的开发环境:

你是在说使用不同的 Java 版本启动 IDE 本身,还是使用不同的版本用于编译和运行应用程序的 IDE?

  • 对于 1.:您可以在 eclipse.ini 中指定要使用的 JVM,如下所述这里。我不知道如何为 Arduino IDE 做到这一点。

  • 对于 2.:在 Eclipse 中,您可以在窗口 -> 首选项 -> Java -> 已安装的 JRE 中选择要使用的 JRE/JDK。在 Java -> 编译器下,您可以根据需要选择较旧的 Java 兼容性。

编辑这个 DigitalOcean 页面还对 Ubuntu 上与 Java 相关的所有内容进行了非常好的解释。

答案2

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

只是一个旁注(太大了,无法发表评论)。如果您需要自动切换到 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)。如果测试套件不需要这个,您可以跳过它。

答案4

我已经检查过的内容/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 

使用以下内容,确保根据系统配置为JAVADIRPRIORITY和变量替换正确的值:BINDIR

#!/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

等等。

相关内容