有没有办法使用快速切换所有与 Java 相关的替代方案update-alternatives
?
例如,如果要将 Java 切换到 7,我运行sudo update-alternatives --config java
并选择 Java 7 OpenJdk。但如果我运行,update-alternatives --get-selections | grep java
我会得到以下内容,
appletviewer auto /usr/lib/jvm/java-6-openjdk-amd64/bin/appletviewer
extcheck auto /usr/lib/jvm/java-6-openjdk-amd64/bin/extcheck
idlj auto /usr/lib/jvm/java-6-openjdk-amd64/bin/idlj
itweb-settings auto /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/itweb-settings
jar auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jar
jarsigner auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jarsigner
java manual /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
javac auto /usr/lib/jvm/java-6-openjdk-amd64/bin/javac
javadoc auto /usr/lib/jvm/java-6-openjdk-amd64/bin/javadoc
javah auto /usr/lib/jvm/java-6-openjdk-amd64/bin/javah
javap auto /usr/lib/jvm/java-6-openjdk-amd64/bin/javap
javaws auto /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/javaws
jconsole auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jconsole
jdb auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jdb
jexec auto /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/jexec
jhat auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jhat
jinfo auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jinfo
jmap auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jmap
jps auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jps
jrunscript auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jrunscript
jsadebugd auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jsadebugd
jstack auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jstack
jstat auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jstat
jstatd auto /usr/lib/jvm/java-6-openjdk-amd64/bin/jstatd
keytool auto /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/keytool
native2ascii auto /usr/lib/jvm/java-6-openjdk-amd64/bin/native2ascii
orbd auto /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/orbd
pack200 auto /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/pack200
policytool auto /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/policytool
rmic auto /usr/lib/jvm/java-6-openjdk-amd64/bin/rmic
rmid auto /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/rmid
rmiregistry auto /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/rmiregistry
schemagen auto /usr/lib/jvm/java-6-openjdk-amd64/bin/schemagen
serialver auto /usr/lib/jvm/java-6-openjdk-amd64/bin/serialver
servertool auto /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/servertool
tnameserv auto /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/tnameserv
unpack200 auto /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/unpack200
wsgen auto /usr/lib/jvm/java-6-openjdk-amd64/bin/wsgen
wsimport auto /usr/lib/jvm/java-6-openjdk-amd64/bin/wsimport
xjc auto /usr/lib/jvm/java-6-openjdk-amd64/bin/xjc
如您所见,我的 Java 替代方案已切换到 7,但基于 OpenJDK 6 的其他所有替代方案均未切换。当然,我可以手动切换每个替代方案或编写脚本来执行此操作,但我认为有更好的方法来实现此目的。
答案1
诀窍是使用update-java-alternatives
(从java-common
包中)。
因此,为了使用 OpenJDK 6 到 7,我曾经update-java-alternatives -l
获取过一份 Java 替代方案列表,然后习惯了sudo update-java-alternatives -s java-1.7.0-openjdk-amd64
JDK。
注意:上述命令引发了以下错误,
update-alternatives: error: no alternatives for mozilla-javaplugin.so.
update-java-alternatives: plugin alternative does not exist: /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/IcedTeaPlugin.so
这是因为默认情况下未安装 openjdk 插件。要修复,请运行
sudo apt-get install icedtea-7-plugin
并重新运行update-java-alternatives
。
答案2
jbro 也问了同样的问题http://ubuntuforums.org/showthread.php?t=1817528并针对这个问题写了一个脚本,
#!/bin/bash
update-alternatives --get-selections | grep -i openjdk |
while read line
do
alternative=$(echo $line | awk '{print $1}')
path=$(echo $line | awk '{print $3}')
newpath=$(echo $path | sed -e 's/java-6-openjdk/java-6-sun/')
status=unchanged
if [ -f $newpath ]
then
status=modified
echo "-> update-alternatives --set $alternative $newpath"
update-alternatives --set $alternative $newpath
else
echo "$alternative unchanged"
fi
done
如果没有更好的答案,这似乎是一个可靠的解决方法,但我认为一定有更好的方法来update-alternatives
解决这个问题。
我稍微编辑了一下代码,因为它不允许你在安装之前进行更改。我又添加了两行,如下所示...
#!/bin/bash
update-alternatives --get-selections | grep -i openjdk |
while read line
do
alternative=$(echo $line | awk '{print $1}')
path=$(echo $line | awk '{print $3}')
newpath=$(echo $path | sed -e 's/java-6-openjdk/java-6-sun/')
status=unchanged
if [ -f $newpath ]
then
status=modified
echo "-> update-alternatives --install /usr/bin/$alternative $alternative $newpath 1"
update-alternatives --install /usr/bin/$alternative $alternative $newpath 1
echo "-> update-alternatives --set $alternative $newpath"
update-alternatives --set $alternative $newpath
else
echo "$alternative unchanged"
fi
done
答案3
< 长话短说 >更新 Java 替代方案使用 .jinfo 文件来确定哪个但也期望它们已经单独配置。
如果您下载的 JRE/JDK 没有切换,请创建一个新的 .jinfo 文件并更新替代条目更新 Java 替代方案
[细节]
要手动配置:
将新的 jdk 与现有的 jdk 一起解压到
/usr/lib/jvm/
生成.jdk名称.jinfo通过复制文件夹中的另一个 .jinfo 文件来获取文件(或者从另一个 Ubuntu 安装中获取一个:你和其他任何东西一样都需要模板)。
文件名。程序名称.jinfo 必须与 jdk 文件夹名称匹配。
修改内容以设置标题(名称)和文件路径(程序条目)以匹配您的新安装。
删除任何引用您的版本中省略的程序的行,并添加新程序的行
/bin
使用此模板为 .jinfo 包中现有的所有程序生成替代方案:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/**jdkname**/bin/java 100
(几个相关的答案已经从 /bin 的内容中编写了脚本,或者您可以在 .jinfo 文件上执行正则表达式搜索/替换来生成脚本命令。)
请注意,100 只是使用自动标志设置 jdk 版本时考虑的优先级。
检查 java 替代方案并切换到使用 JDK。
update-java-alternatives -l update-java-alternatives -s jdkname
请注意,某些 JDK 不包含 JRE,因此请添加它或删除那些 jinfo 条目。
答案4
对于 Oracle JVM,运行以下命令:
sudo update-java-alternatives -s java-7-oracle