【发布时间】:2021-06-11 17:55:29
【问题描述】:
我有两台 Ubuntu 20.04 服务器,Alpha 版和 Beta 版,都安装了从标准存储库中安装的 Tomcat 9。原则上,它们应该几乎相同,但我发现每个使用的 Java 版本存在差异,我无法找到其来源。
在服务器 Alpha 上,Tomcat 的 ps 进程列表和 systemctl status tomcat9.service 都显示其 Java 二进制文件是 /usr/lib/jvm/java-8-openjdk-amd64/bin/java。在服务器 Beta 上,相同的命令显示 Tomcat 的 Java 二进制文件是 /usr/lib/jvm/default-java/bin/java,它是指向 /usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java 的符号链接。
因此,服务器 Alpha 使用 Java 8,而服务器 Beta 使用 Java 11。它们应该是相同的,但显然有些不同。
此时明显的问题是,Tomcat 如何确定使用哪个版本的 Java?
1) 文档
我在Tomcat configuration documentation 中找不到此问题的答案,并且文档中似乎没有与此问题相关的其他顶级主题。
2) 堆栈溢出
这个 Stack Overflow question 是我能在网站上找到的最好的,它对 Ubuntu 系统没有任何有用的答案;一个答案中提到了/etc/sysconfig/tomcat{N},但它在任一服务器上都不存在,而/etc/default/tomcat{N} 在两者上都存在但不包含与Java版本相关的任何参数。
3) 标准配置文件
我还检查了主 Tomcat 配置文件 /var/lib/tomcat9/conf/server.xml 和 Tomcat systemd 服务文件 /lib/systemd/system/tomcat9.service,但都没有包含任何与 Java 版本相关的参数。两台服务器都有一个服务文件覆盖/etc/systemd/system/tomcat9.service.d/override.conf,但由于我自己写的,我确定它没有设置使用的Java版本。
4) setenv.sh
Tomcat 的 /usr/share/tomcat9/bin/catalina.sh 文件提到了一个 JAVA_HOME 环境变量,我必须假设它就是我正在寻找的。该文件似乎期望在它获取两个文件之一时设置此变量,$CATALINA_BASE/bin/setenv.sh 或$CATALINA_HOME/bin/setenv.sh。这些文件(或bin/ 目录,甚至)都不存在于任一服务器上,因此这无法解释差异。
这就是我能想到的。问题是:
在没有明确的用户配置的情况下,什么决定了Tomcat使用什么Java版本?这个信息必须存储在Tomcat安装的一个文件中,但我无法知道是哪一个。
编辑
正如@Emerson Pardo 建议的那样,Ubuntu 20.04 的两个实例确实具有不同的默认 Java 版本。但是,在使用 Debian/Ubuntu update-alternatives 程序将 Beta 版更改为使用 Java 8 并重新启动 Tomcat 之后,上述问题没有改变。 Tomcat 继续使用
/usr/lib/jvm/default-java/bin/java -> /usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java
测试版。
【问题讨论】:
-
它是 Tomcat 特有的吗?如果你在两台服务器上运行
java --version,你会得到什么? -
@GaëlJ
java --version在 Alpha 上给出错误Unrecognized option: --version。在测试版上,它给了openjdk 11.0.11 2021-04-20,直到我尝试了@Emerson Pardo 的建议。现在它给出了Unrecognized option: --version。请参阅我对该答案的第一条评论,它似乎是特定于 Tomcat 的。 -
好的,Java 8 和 11 之间的版本检查肯定发生了变化。对于 8,它是
java -version,带有一个破折号,它在两台服务器上都给出了openjdk version "1.8.0_292"。