UbuntuでのJDK管理
最近仕事でJavaを使う雰囲気になってきた。
Javaは昔少しやったきりであんまり分かってない。
しかも色々あってJava6以降対応みたいな感じで作ることになりそう。
JDKの複数バージョンってどう管理すれば良いんだろう?
Windowsで昔さわったときは環境変数JAVA_HOMEを切り替えてたけど。
OpenJDKとOracleJDK
調べ始めたらそもそもOpenJDKとOracleJDKのどっちが良いの?となった。
https://help.ubuntu.com/community/Java
OpenJDK
JDKのオープンソース実装でUbuntの公式リポジトリでサポートされている。
単にJREでJavaアプリケーションを動かすだけならこちらの系統で良さそう。
OracleJDK
SUNの流れを組むOracle様の実装。
wgetでダウンロードできないなど不満はあるけど一般的には所謂JDKとはこちらを指していそう。
仕事で使うなら素直にこちらを使えば良さそう(根拠薄)。
OpenJDK推奨みたいなシチュエーションって何かあるんだろうか?
JDKの切り替え
update-alternatives
さっきのURLにもあるけど基本的にはupdate-alternatives
使えとある。
http://askubuntu.com/questions/56104/how-can-i-install-sun-oracles-proprietary-java-jdk-6-7-8-or-jre
あと例では、解凍なりなんなりしたJDKのディレクトリは/usr/lib/jvm/
に置いているのでそういう流儀なのかな?
「JDK 複数バージョン」などでググるとやはりupdate-alternatives
が多い。
JAVA_HOME
update-alternatives
は詰まるところ/etc/alternatives
内のシンボリックリンクをいじってバージョンの変更を実現しているのでまあ理屈は分かりやすいと思った。
ただ最初に登録するのがjava, javac, jwsと書いてあって、「他のbinの下のコマンドは登録しなくていいの?」とか、「なんで別々に登録したコマンドがsudo update-alternatives --config java
でまとめて変更できるんだろう?」とか疑問が発生した。
というかJAVA_HOMEの変更じゃダメなの?
OpenJDKはapt-getした時点でalternativesの管理下になってしまうので難しいのかな?
そうしたら同じような疑問をもった人がいたらしい。
The 2 mechanisms are related but can be used together or independent of each other, it really depends on the Java application which mechanism is preferable.
つまりupdate-alternatives
とJAVA_HOMEを変更する方式は共存できるとのこと。
じゃあJAVA_HOMEの変更の方がシェルスクリプトからも使いやすいし自分の好みだ。
結局自分はどうしたか?
とりあえずは自分のデスクトップで複数バージョンが使えれば良いので、必要にかられるまではJAVA_HOMEの変更でいくことにした。
またインストール先は/opt以下にした。理由はOpenJDKと混ぜると自分が混乱しそうだから。
たぶんOracleJDKとOpenJDKの混在を見慣れてくれば問題ないことだけど。
個人のデスクトップマシンだから/optにしたけど~/optでも良いと思う。
$ tail -n 4 ~/.profile export JAVA_HOME=/opt/jdk1.6.0_45 #export JAVA_HOME=/opt/jdk1.7.0_65 #export JAVA_HOME=/opt/jdk1.8.0_11 PATH=$JAVA_HOME/bin:$PATH
まだ試してないけどupdate-alternatives
に登録するときは以下で見れるコマンドを登録するのが良いのだろう。
$ ls -l /etc/alternatives/ja* lrwxrwxrwx 1 root root 41 Jun 22 00:22 /etc/alternatives/jar -> /usr/lib/jvm/java-7-openjdk-amd64/bin/jar* lrwxrwxrwx 1 root root 51 Jun 22 00:22 /etc/alternatives/jar.1.gz -> /usr/lib/jvm/java-7-openjdk-amd64/man/man1/jar.1.gz lrwxrwxrwx 1 root root 47 Jun 22 00:22 /etc/alternatives/jarsigner -> /usr/lib/jvm/java-7-openjdk-amd64/bin/jarsigner* lrwxrwxrwx 1 root root 57 Jun 22 00:22 /etc/alternatives/jarsigner.1.gz -> /usr/lib/jvm/java-7-openjdk-amd64/man/man1/jarsigner.1.gz lrwxrwxrwx 1 root root 46 Jun 22 00:53 /etc/alternatives/java -> /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java* lrwxrwxrwx 1 root root 56 Jun 22 00:53 /etc/alternatives/java.1.gz -> /usr/lib/jvm/java-7-openjdk-amd64/jre/man/man1/java.1.gz lrwxrwxrwx 1 root root 43 Jun 22 00:53 /etc/alternatives/javac -> /usr/lib/jvm/java-7-openjdk-amd64/bin/javac* lrwxrwxrwx 1 root root 53 Jun 22 00:53 /etc/alternatives/javac.1.gz -> /usr/lib/jvm/java-7-openjdk-amd64/man/man1/javac.1.gz lrwxrwxrwx 1 root root 45 Jun 22 00:22 /etc/alternatives/javadoc -> /usr/lib/jvm/java-7-openjdk-amd64/bin/javadoc* lrwxrwxrwx 1 root root 55 Jun 22 00:22 /etc/alternatives/javadoc.1.gz -> /usr/lib/jvm/java-7-openjdk-amd64/man/man1/javadoc.1.gz lrwxrwxrwx 1 root root 43 Jun 22 00:22 /etc/alternatives/javah -> /usr/lib/jvm/java-7-openjdk-amd64/bin/javah* lrwxrwxrwx 1 root root 53 Jun 22 00:22 /etc/alternatives/javah.1.gz -> /usr/lib/jvm/java-7-openjdk-amd64/man/man1/javah.1.gz lrwxrwxrwx 1 root root 43 Jun 22 00:22 /etc/alternatives/javap -> /usr/lib/jvm/java-7-openjdk-amd64/bin/javap* lrwxrwxrwx 1 root root 53 Jun 22 00:22 /etc/alternatives/javap.1.gz -> /usr/lib/jvm/java-7-openjdk-amd64/man/man1/javap.1.gz lrwxrwxrwx 1 root root 48 Jun 22 00:30 /etc/alternatives/javaws -> /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/javaws* lrwxrwxrwx 1 root root 58 Jun 22 00:30 /etc/alternatives/javaws.1.gz -> /usr/lib/jvm/java-7-openjdk-amd64/jre/man/man1/javaws.1.gz
追記 2014.01.10
Macでの話も書いた。
MacでのJDK管理 - my coredump