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


51

有没有一种方法可以使用快速切换所有与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的替代方案都未切换。当然,我可以手动切换每个脚本或编写脚本来执行此操作,但是我认为有一种更好的方法可以完成此操作。

Answers:


70

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


8
您不必安装插件(出于安全考虑,如果不需要,则不需要安装)。update-java-alternatives更改所有其他Java替代方法,即使插件设置引发错误也是如此。
丹尼尔·库尔曼

什么是Oracle JVM?我该如何使用呢?以及JDK特定的可执行文件?
凯基

2
跑步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

3

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

1

对于Oracle JVM,运行以下命令:

sudo update-java-alternatives -s java-7-oracle

0

<TL; DR> 更新的Java-替代使用.jinfo文件来确定哪个切换跨越替代也希望他们已被单独配置。

如果您下载的JRE / JDK无法通过update-java-alternatives切换,则创建一个新的.jinfo文件和update-alternative条目。

[细节]

手动配置:

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

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

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

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

    删除所有与您的版本中省略的程序相关的行,并为中的新程序添加行 /bin

  3. 使用此模板,现在为.jinfo包中的所有程序生成替代文件:

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

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

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

  4. 检查Java替代方法并切换为使用JDK。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.