alternatives --config java で JDK を変更しても Tomcat に反映されない
カテゴリ:Java
CentOS 7 で alternatives --config java で使用する JDK を変更しても Tomcat が使用する JDK が変わらない環境と、正常に変更される環境が存在したため原因を調査してみました。環境
OS | CentOS 7.9.2009 |
---|---|
Tomcat | Apache 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