torutkのブログ

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

alternativesによるGCJとSun JDKの切り替え

Linuxでは、標準パッケージであるGCCJava言語機能である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