複数の Java Development Kit (JDK) を同一サーバー上にインストールし、状況に応じてバージョンを切り替える必要がある場合、手動でシンボリックリンクを張り替える方法は推奨されません。Debian 系 Linux ディストリビューションでは、update-alternatives コマンドを利用することで、システム標準の仕組みとしてバージョン管理を行うことができます。この手法を用いると、java コマンドと javac コマンドなどで異なるバージョンを割り当てるような柔軟な設定も可能です。
新規バージョンを登録する前に、現在設定されているバージョンの優先度(priority)を確認します。既存の設定よりも高い優先度を新規バージョンに設定することで、自動モードにおいて新しいバージョンが選択されるようにします。
現在の javac コマンドの状態を確認するには、以下のコマンドを実行します。
sudo update-alternatives --display javac
出力結果から、現在のリンク先と優先度を読み取ります。例えば、Java 8 が優先度 1000 で登録されている場合、新規に導入する Java 11 にはそれよりも高い値、例えば 2000 を設定します。
次に、新しい JDK をインストールします。Ubuntu のパッケージマネージャーを使用する場合は以下の通りです。
sudo apt-get install -y openjdk-11-jdk
インストールが完了すると、バイナリファイルは通常 /usr/lib/jvm/java-11-openjdk-amd64/bin/ 配下に配置されます。パッケージインストール時に自動的に登録されないコマンドについては、手動で update-alternatives に登録します。主要なコマンドを高い優先度で登録する手順は以下の通りです。
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-amd64/bin/java 2000
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-11-openjdk-amd64/bin/javac 2000
sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/java-11-openjdk-amd64/bin/jar 2000
必要に応じて jshell や jmap などの他のツールも同様に登録可能です。登録後、再度 display コマンドを実行し、新しいバージョンが優先されて選択されていることを確認します。
sudo update-alternatives --display javac
java -version
出力に新しいバージョン番号が表示されれば設定は成功です。システムが自動的に最高優先度のバージョンを選ぶようにするには、各コマンドを auto モードに設定します。
sudo update-alternatives --auto java
sudo update-alternatives --auto javac
sudo update-alternatives --auto jar
これで優先度の高いバージョンが自動的に選択される状態になります。