web-dev-qa-db-ja.com

すべてのJava関連の代替を更新する方法はありますか?

update-alternativesを使用して、すべてのJava関連の代替をすばやく切り替える方法はありますか?

たとえば、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に基づく他のすべての代替は切り替えられませんでした。確かに、それぞれを手動で切り替えるか、そうするためのスクリプトを書くことができますが、これを達成するためのより良い方法があると思います。

51
James McMahon

トリックはupdate-Java-alternativesJava-commonパッケージから)を使用することです。

OpenJDK 6から7に移行するために、Java代替のリストを取得するためにupdate-Java-alternatives -lを使用し、JDKにSudo update-Java-alternatives -s Java-1.7.0-openjdk-AMD64を使用しました。

注:上記のコマンドは次のエラーをスローしました。

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を再実行します。

70
James McMahon

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がこれを処理するためのより良い方法が必要だと思います。

インストールする前に変更を行うことができないため、コードを少し編集しました。次のようにさらに2行追加しました...

#!/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
James McMahon

Oracle JVMの場合、次を実行します。

Sudo update-Java-alternatives -s Java-7-Oracle
1
SteveQian

<TL; DR> pdate-Java-alternativesは.jinfoファイルを使用して、whichを切り替える代替手段を決定しますそれらは個別に構成されています。

ダウンロードしたJRE/JDKがupdate-Java-alternativesで切り替わらない場合、新しい.jinfoファイルとupdate-alterntiveエントリを作成します

[詳細]

手動で構成するには:

  1. /usr/lib/jvm/の既存のjdkと一緒に新しいjdkを解凍します

  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ファイルで正規表現検索/置換を実行してスクリプトコマンドを生成できます。)

    100は、自動フラグを使用してjdkバージョンを設定するときに考慮される優先順位にすぎないことに注意してください。

  4. Java選択肢を確認し、JDKを使用するよう切り替えます。

    update-Java-alternatives -l  
    update-Java-alternatives -s jdkname  
    

    一部のJDKにはJREが含まれていないため、JREを追加または削除することに注意してください。

0
simon coleman