有没有办法更新所有与 Java 相关的替代品?

有没有办法更新所有与 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 的其他所有替代方案均未切换。当然,我可以手动切换每个替代方案或编写脚本来执行此操作,但我认为有更好的方法来实现此目的。

答案1

诀窍是使用update-java-alternatives(从java-common包中)。

因此,为了使用 OpenJDK 6 到 7,我曾经update-java-alternatives -l获取过一份 Java 替代方案列表,然后习惯了sudo update-java-alternatives -s java-1.7.0-openjdk-amd64JDK。

注意:上述命令引发了以下错误,

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 替代方案

[细节]

要手动配置:

  1. 将新的 jdk 与现有的 jdk 一起解压到/usr/lib/jvm/

  2. 生成.jdk名称.jinfo通过复制文件夹中的另一个 .jinfo 文件来获取文件(或者从另一个 Ubuntu 安装中获取一个:你和其他任何东西一样都需要模板)。

    文件名。程序名称.jinfo 必须与 jdk 文件夹名称匹配。

    修改内容以设置标题(名称)和文件路径(程序条目)以匹配您的新安装。

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

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

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

    (几个相关的答案已经从 /bin 的内容中编写了脚本,或者您可以在 .jinfo 文件上执行正则表达式搜索/替换来生成脚本命令。)

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

  4. 检查 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

相关内容