在 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-alternatives
JDK 版本会发生变化两个都对我来说,这是个不错的程序。使用第一个命令,您可以使用来自不同 JDK 的 Java VM 和 Java 编译器。
update-java-alternatives
.jinfo
要求目录中存在扩展名为 的文件/usr/lib/jvm
。openjdk
软件包附带一个.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-alternatives
和update-alternatives
。
首先,确保所有备选方案都已正确配置。java 和 javac 只是其中的几个。还有javadoc
、rmic
和serialver
其他,用上面的变量代替: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
使用以下内容,确保根据系统配置为JAVADIR
、PRIORITY
和变量替换正确的值: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
等等。