my coredump

自分用の公開メモです。主にプログラムのこととか書くはず。

UbuntuでのJDK管理

最近仕事でJavaを使う雰囲気になってきた。
Javaは昔少しやったきりであんまり分かってない。

しかも色々あってJava6以降対応みたいな感じで作ることになりそう。

JDK複数バージョンってどう管理すれば良いんだろう?
Windowsで昔さわったときは環境変数JAVA_HOMEを切り替えてたけど。

OpenJDKとOracleJDK

調べ始めたらそもそもOpenJDKとOracleJDKのどっちが良いの?となった。
https://help.ubuntu.com/community/Java

OpenJDK

JDKオープンソース実装でUbuntの公式リポジトリでサポートされている。
単にJREJavaアプリケーションを動かすだけならこちらの系統で良さそう。

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の管理下になってしまうので難しいのかな?

そうしたら同じような疑問をもった人がいたらしい。

http://unix.stackexchange.com/questions/123412/what-is-the-difference-between-java-home-and-update-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-alternativesJAVA_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