alternatives --config java で JDK を変更しても Tomcat に反映されない

カテゴリ:Java

CentOS 7 で alternatives --config java で使用する JDK を変更しても Tomcat が使用する JDK が変わらない環境と、正常に変更される環境が存在したため原因を調査してみました。

環境

OSCentOS 7.9.2009
TomcatApache Tomcat/7.0.76 (tomcat-7.0.76-16.el7_9.noarch)

正常な環境の場合

以下は、Tomcatの使用するJVMが正常に変更される環境の設定状況です。

OpenJDK 1.8の場合

Systemd の Tomcat の起動スクリプト /usr/lib/systemd/system/tomcat.service の EnvironmentFile に指定されている /etc/tomcat/tomcat.conf ファイルにおいて JAVA_HOME は /usr/lib/jvm/jre に指定されています。

# cat /usr/lib/systemd/system/tomcat.service | grep EnvironmentFile
EnvironmentFile=/etc/tomcat/tomcat.conf
EnvironmentFile=-/etc/sysconfig/tomcat
# cat /etc/tomcat/tomcat.conf | grep JAVA_HOME
JAVA_HOME="/usr/lib/jvm/jre"

この /usr/lib/jvm/jre は /etc/alternatives/jre へのシンボリックリックになっています。

# ls -la /usr/lib/jvm/jre
lrwxrwxrwx 1 root root 21 10月  1 11:46 /usr/lib/jvm/jre -> /etc/alternatives/jre

/etc/alternatives/jre は usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64/jre へのシンボリックリンクになっています。

# ls -ls /etc/alternatives/jre
0 lrwxrwxrwx 1 root root 64 10月  1 11:46 /etc/alternatives/jre -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64/jre

当然Tomcatでも JVM は 1.8.0_382-b05 になっています。

# /usr/sbin/tomcat version
Server version: Apache Tomcat/7.0.76
Server built:   Nov 16 2020 16:51:26 UTC
Server number:  7.0.76.0
OS Name:        Linux
OS Version:     3.10.0-1160.99.1.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_382-b05
JVM Vendor:     Red Hat, Inc.

Oracle JDK 18.0.2.1に変更した場合

ここで alternatives --config java でJDKをOracle JDK 18.0.2.1に変更します。

# alternatives --config java

2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*  1           /usr/java/jdk-18.0.2.1/bin/java
 + 2           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64/jre/bin/java)

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:1

きちんと 18.0.2.1 に変更されたことが確認できます。

# java -version
java version "18.0.2.1" 2022-08-18
Java(TM) SE Runtime Environment (build 18.0.2.1+1-1)
Java HotSpot(TM) 64-Bit Server VM (build 18.0.2.1+1-1, mixed mode, sharing)

当然 /etc/tomcat/tomcat.conf の JAVA_HOME は /usr/lib/jvm/jre のままです。

# cat /etc/tomcat/tomcat.conf | grep JAVA_HOME
JAVA_HOME="/usr/lib/jvm/jre"

しかし、/usr/lib/jvm/jre が無くなっています。このため alternatives --config java で指定したJDKバージョンを参照するようです。

# ls -la /usr/lib/jvm/jre
ls: /usr/lib/jvm/jre にアクセスできません: そのようなファイルやディレクトリはありません

実際、Tomcatが使用する JVM はちゃんと 18.0.2.1 になっています。

# /usr/sbin/tomcat version
Server version: Apache Tomcat/7.0.76
Server built:   Nov 16 2020 16:51:26 UTC
Server number:  7.0.76.0
OS Name:        Linux
OS Version:     3.10.0-1160.99.1.el7.x86_64
Architecture:   amd64
JVM Version:    18.0.2.1+1-1
JVM Vendor:     Oracle Corporation

TomcatのJVMのバージョンが変わらない環境の場合

/usr/lib/systemd/system/tomcat.service の EnvironmentFile には /etc/tomcat/tomcat.conf が指定されているのは同じです。

# cat /usr/lib/systemd/system/tomcat.service | grep EnvironmentFile
EnvironmentFile=/etc/tomcat/tomcat.conf
EnvironmentFile=-/etc/sysconfig/tomcat

しかし、こちらは JAVA_HOME に /usr/java/default が指定されています。

# cat /etc/tomcat/tomcat.conf | grep JAVA_HOME
JAVA_HOME="/usr/java/default"

/usr/java/default は /usr/java/latest へのシンボリックリンクになっています。

# ls -la /usr/java/default
lrwxrwxrwx 1 root root 16 Nov  6  2018 /usr/java/default -> /usr/java/latest

/usr/java/latest は /usr/java/jdk1.8.0_191-amd64 へのシンボリックリンクになっています。

# ls -la /usr/java/latest
lrwxrwxrwx 1 root root 28 Nov  6  2018 /usr/java/latest -> /usr/java/jdk1.8.0_191-amd64

JDKを 18.0.2.1 に変更します。

# alternatives --config java

There are 3 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
   1           /usr/java/jdk1.8.0_191-amd64/jre/bin/java
   2           /usr/java/jdk1.8.0_191-amd64/bin/java
*+ 3           /usr/java/jdk-18.0.2.1/bin/java

Enter to keep the current selection[+], or type selection number: 3
# java -version
java version "18.0.2.1" 2022-08-18
Java(TM) SE Runtime Environment (build 18.0.2.1+1-1)
Java HotSpot(TM) 64-Bit Server VM (build 18.0.2.1+1-1, mixed mode, sharing)

しかしJDK 18.0.2.1 に変更しても、/usr/java/latest のシンボリックリンクは 1.8.0_191-b12 のままで更新されていません

# ls -la /usr/java/latest
lrwxrwxrwx 1 root root 28 Nov  6  2018 /usr/java/latest -> /usr/java/jdk1.8.0_191-amd64

このため、Tomcatは 1.8.0_191-b12 を使用し続ける事になります。

# /usr/sbin/tomcat version
Server version: Apache Tomcat/7.0.76
Server built:   Nov 16 2020 16:51:26 UTC
Server number:  7.0.76.0
OS Name:        Linux
OS Version:     3.10.0-1160.99.1.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_191-b12
JVM Vendor:     Oracle Corporation

つまり原因は /etc/tomcat/tomcat.conf の JAVA_HOME に /usr/java/default が指定されていることにあることを突き止めました。

同じ CentOS 7 でも /etc/tomcat/tomcat.conf の JAVA_HOME に /usr/java/default が指定されている環境と、/usr/lib/jvm/jre が指定されている環境があるのは何故であるかは不明です。

※過去に自分が設定したのかもしれません。

ちなみに、正常な環境の方も、JDK バージョンを変更しても /usr/java/latest のシンボリックリンクは変わりませんでした。

# alternatives --config java

2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/java/jdk-18.0.2.1/bin/java
   2           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64/jre/bin/java)

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2
# java -version
openjdk version "1.8.0_382"
OpenJDK Runtime Environment (build 1.8.0_382-b05)
OpenJDK 64-Bit Server VM (build 25.382-b05, mixed mode)
# ls -la /usr/java/latest
lrwxrwxrwx. 1 root root 22  9月 28 23:45 /usr/java/latest -> /usr/java/jdk-18.0.2.1

つまり、alternatives --config java では /usr/java/latest のバージョン(シンボリックリンク)は変更されないということは言えそうです。/usr/java/latest は最新の Oracle JDK をインストールした場合にのみシンボリックリンクが変更されるようですが、問題の起きた環境では、何故か変更されていなかったということのようです。(それはそれで疑問が残りますが)

解決方法

/etc/tomcat/tomcat.conf の JAVA_HOME に /usr/lib/jvm/jre を指定します。

NoteOpenJDKを選択した場合のみ JAVA_HOME として参照されるため、Oracle JDK しか使わないなら空でも良い。
JAVA_HOME はそのままで /usr/java/latest のシンボリックリンクを最新 JDK に手動で変更してもいいが、数年もしたら忘れてしまうため、JDK を更新した場合にまた同じ問題に悩まされる可能性があり、お勧めはできない。(人間の記憶をあてにした設定は避けるべき)

変更後Tomcatを再起動し、18.0.2.1 に変更されたことを確認します。

# /usr/sbin/tomcat version
Server version: Apache Tomcat/7.0.76
Server built:   Nov 16 2020 16:51:26 UTC
Server number:  7.0.76.0
OS Name:        Linux
OS Version:     3.10.0-1160.99.1.el7.x86_64
Architecture:   amd64
JVM Version:    18.0.2.1+1-1
JVM Vendor:     Oracle Corporation

公開日時:2023年10月01日 12:47:17
最終更新日時:2023年10月11日 13:55:34

なお、VPS選びで迷ったらこちらの記事で主要VPSのメモリ容量ごとの月額、年額料金を比較していますので、是非参考にしてみてください。

Javaに戻る

このページのトップに戻る