Linuxでは、標準パッケージであるGCCのJava言語機能であるGCJ版のコマンドが標準ディレクトリ(/usr/bin/)から起動されます。例えば、java, rmid, pack200, keytoolなどです。しかし、/usr/bin/の下に直接GCJのコマンドが入っているのではなく、実はシンボリックリンクとなっています。以下はCentOS 5.3における/usr/bin/javaのコマンドの実体です。
~$ ls -l /usr/bin/java lrwxrwxrwx 1 root root 22 6月 13 17:27 /usr/bin/java -> /etc/alternatives/java ~$ ls -l /etc/alternatives/java lrwxrwxrwx 1 root root 35 6月 13 17:27 /etc/alternatives/java -> /usr/lib/jvm/jre-1.4.2-gcj/bin/java ~$ ls -l /usr/lib/jvm/jre-1.4.2-gcj/bin/java lrwxrwxrwx 1 root root 12 2月 28 23:32 /usr/lib/jvm/jre-1.4.2-gcj/bin/java -> /usr/bin/gij ~$ file /usr/bin/gij /usr/bin/gij: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped ~$
/usr/bin/javaは、一旦/etc/alternatives/javaを介して、/usr/lib/jvm/jre-1.4.2-gcj/bin/javaを指し、さらにこれが実体である/usr/bin/gijを指すというシンボリックリンク連鎖となっています。
ここで、/etc/alternativesディレクトリにあるシンボリックリンクは、複数のバージョンのアプリケーションの切り替えや、同種で異なる実装のアプリケーションの切り替えを行うalternativesという機能によるものです。
~$ alternatives --display java java -ステータスは自動です。 リンクは現在 /usr/lib/jvm/jre-1.4.2-gcj/bin/java を指しています。 /usr/lib/jvm/jre-1.4.2-gcj/bin/java - 優先項目 1420 スレーブ javaws: (null) スレーブ keytool: /usr/lib/jvm/jre-1.4.2-gcj/bin/keytool : (中略) スレーブ tnameserv.1.gz: (null) スレーブ unpack200.1.gz: (null) 現在の「最適」バージョンは /usr/lib/jvm/jre-1.4.2-gcj/bin/java です。 ~$
alternativesに、別なバージョンのjavaを登録しておくと、/etc/alternativesの切り替えによる設定変更ができるようになります。
ここで、SunのJDKが持つコマンドをいくつかalternativesで切り替え管理できるよう登録します。--installオプションを使用します。また、複数のコマンドを1つの項目でまとめて切り替えるよう、--slaveオプションで一連で切り替えるコマンドを指定します。
# alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_14/bin/java 200 \ --slave /usr/bin/java_vm java_vm /usr/java/jdk1.6.0_14/jre/bin/java_vm \ --slave /usr/bin/javaws javaws /usr/java/jdk1.6.0_14/jre/bin/javaws \ : (中略) --slave /usr/bin/unpack200 unpack200 /usr/java/jdk1.6.0_14/jre/bin/unpack200 #
優先度の指定はよく分からなかったので、てきとーな値を入れています。
登録が成功すると、切り替えができるようになります。
# alternatives --config java 2 プログラムがあり 'java' を提供します。 選択 コマンド ----------------------------------------------- *+ 1 /usr/lib/jvm/jre-1.4.2-gcj/bin/java 2 /usr/java/jdk1.6.0_14/bin/java Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2