Javaで作られたプログラムでは、環境変数JAVA_HOMEを要求するものがあります。Linuxの場合、標準で搭載されるGCCのGCJはバージョンが古い、互換性の問題で実質はSunのJDKをダウンロードしてインストールするのがほとんどでしたので、JAVA_HOMEはほぼ固定(/usr/java/latest等)でした。
しかし最近は、openjdkがLinuxに搭載されるようになり、CentOSも5.3からopenjdkが搭載されるようになって、SunのJDKとopenjdkのパスが違い、設定がちょっと面倒になりました。
そこで、javacコマンドのある場所からJAVA_HOMEを算出しようと思い立ちましたが、CentOSでは/usr/bin/javacがシンボリックリンクで/etc/alternatives/javacとなり、また/etc/alternatives/javacもシンボリックとなっており、簡単にパスが抽出できません。
調べてみると、readlinkコマンドを使うと、シンボリックリンクから実パスが取得できるので、解決になりそうです。
$ which javac /usr/bin/javac $ readlink $(which javac) /etc/alternatives/javac $ readlink $(readlink $(which javac)) /usr/lib/jvm/java-1.6.0-openjdk/bin/javac $
readlink に-eオプションを付けると、多段のシンボリックリンクも一発で実パスに変換できます。
$ readlink -e $(which javac) /usr/lib/jvm/java-1.6.0-openjdk/bin/javac
あとは、実パスから、2段上の親ディレクトリを取得するだけです。
function setjdk { pathtojava=$(readlink -e $(which javac)) export JAVA_HOME=${pathtojava%/*/*} }
とシェル関数を定義しておけば、setjdk でどちらのJavaパッケージがインストールされていても、JAVA_HOMEを設定できます。