torutkのブログ

ソフトウェア・エンジニアのブログ

シンボリックリンクの実パス取得しJAVA_HOMEを設定する

Javaで作られたプログラムでは、環境変数JAVA_HOMEを要求するものがあります。Linuxの場合、標準で搭載されるGCCGCJはバージョンが古い、互換性の問題で実質は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を設定できます。