有没有一种方法可以更新所有与Java相关的替代品?

有没有一种快速切换所有与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的其他替代方案并未切换。我可以手动切换每个替代方案或编写脚本来完成此操作,但我相信有更好的方法来实现这一目标。
4个回答

诀窍是使用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命令。

9你不需要安装插件(如果你不需要的话,出于安全考虑,你也不应该安装)。update-java-alternatives会更改所有其他的Java替代方案,即使插件设置出现错误。 - daniel kullmann
什么是 Oracle 的 JVM?我如何使用它?还有 JDK 特定的可执行文件呢? - keiki
4运行 update-java-alternatives --set java-1.8.0-openjdk-amd64 后,我仍然有 default-java -> /usr/lib/jvm/java-7-oracle。这是由于 no alternatives for mozilla-javaplugin.so 错误引起的吗?我该如何改变这个呢? - lony

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

< TL;DR > update-java-alternatives 使用 .jinfo 文件来确定要切换的替代方案,但也期望它们已经被单独配置。

如果您下载的 JRE/JDK 无法通过 update-java-alternatives 进行切换,请创建一个新的 .jinfo 文件并更新替代项。

[详细信息]

要手动配置它:

  1. 将新的jdk解压到现有的jdk旁边,路径为/usr/lib/jvm/

  2. 通过复制文件夹中的另一个.jinfo文件(或从另一个Ubuntu安装中获取一个:你需要的是模板),生成一个.jdkname.jinfo文件。

    .jdkname.jinfo文件名必须与jdk文件夹名匹配。

    修改内容以设置头部(名称)和文件路径(程序条目),使其与新安装相匹配。

    删除任何引用您版本中省略的程序的行,并在/bin中添加新程序的行。

  3. 使用以下模板为.jinfo包中的所有程序生成替代方案:

    sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/**jdkname**/bin/java 100
    

    (几个相关的答案已经根据/bin目录的内容编写了脚本,或者您可以对.jinfo文件进行正则表达式搜索/替换以生成脚本命令。)

    请注意,100只是在使用auto标志设置jdk版本时考虑的优先级。

  4. 检查java的替代方案并切换到使用JDK。

    update-java-alternatives -l  
    update-java-alternatives -s jdkname  
    

    请注意,某些JDK不包含JRE,因此请添加它或删除那些jinfo条目。


对于 Oracle JVM,请执行以下操作:
sudo update-java-alternatives -s java-7-oracle