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に基づく他のすべての代替は切り替えられませんでした。確かに、それぞれを手動で切り替えるか、そうするためのスクリプトを書くことができますが、これを達成するためのより良い方法があると思います。
トリックはupdate-Java-alternatives
(Java-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
を再実行します。
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
Oracle JVMの場合、次を実行します。
Sudo update-Java-alternatives -s Java-7-Oracle
<TL; DR> pdate-Java-alternativesは.jinfoファイルを使用して、whichを切り替える代替手段を決定しますそれらは個別に構成されています。
ダウンロードしたJRE/JDKがupdate-Java-alternativesで切り替わらない場合、新しい.jinfoファイルとupdate-alterntiveエントリを作成します
[詳細]
手動で構成するには:
/usr/lib/jvm/
の既存のjdkと一緒に新しいjdkを解凍します
フォルダー内の別の.jinfoファイルを複製することで。jdkname.jinfoファイルを生成します(または別のUbuntuインストールからファイルを取得します:他のものと同じようにテンプレートの後になります)。
ファイル名.jdkname。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が含まれていないため、JREを追加または削除することに注意してください。