我有两台Ubuntu20.04服务器,alpha和beta,都是从标准repo安装的Tomcat9。原则上,它们应该是完全相同的,但我发现每个版本的java使用的不一致,我找不到它们的来源。
在服务器alpha上,两个 ps
tomcat和 systemctl status tomcat9.service
显示它的java二进制是 /usr/lib/jvm/java-8-openjdk-amd64/bin/java
. 在服务器测试版上,同样的命令显示tomcat的java二进制是 /usr/lib/jvm/default-java/bin/java
,这是指向的符号链接 /usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java
.
因此,服务器alpha使用Java8,而服务器beta使用Java11。
此时一个明显的问题是,tomcat如何确定使用哪个版本的java?
1) 文件
我在tomcat配置文档中找不到这个问题的答案,文档中也没有其他与这个问题相关的顶级主题。
2) 堆栈溢出
这个堆栈溢出问题是我在网站上能找到的最好的问题,对于ubuntu系统它没有任何有用的答案; /etc/sysconfig/tomcat{N}
在一个答案中提到,但它在两台服务器上都不存在,而 /etc/default/tomcat{N}
在这两个版本上都存在,但不包含任何与java版本相关的参数。
3) 标准配置文件
我还检查了主tomcat配置文件 /var/lib/tomcat9/conf/server.xml
那雄猫呢 systemd
服务文件 /lib/systemd/system/tomcat9.service
,但两者都不包含任何与java版本相关的参数。两台服务器都有一个服务文件覆盖 /etc/systemd/system/tomcat9.service.d/override.conf
,但因为我自己写的,我确信它没有设置所使用的java版本。
4) setenv.sh
雄猫的 /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将测试版改为使用Java8之后 update-alternatives
编程并重新启动tomcat,但上述问题没有改变。tomcat继续使用
/usr/lib/jvm/default-java/bin/java -> /usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java
测试版。
2条答案
按热度按时间puruo6ea1#
在debian 10的派生版本上,例如ubuntu 20.04,tomcat是通过位于
/usr/libexec/tomcat9/tomcat-start.sh
. 如果你不设定JAVA_HOME
你自己的启发式程序是在/usr/libexec/tomcat9/tomcat-locate-java.sh
:因此:
如果
/usr/lib/jvm/default-java
如果它被选中,否则,将使用java的最高版本(最多11个)。
hgb9j2n62#
通常,ubuntu会选择默认使用的java。您可以这样找到它:
您还可以使用以下方法检查系统中可用的备选方案:
它将列出所有已安装的java。
要选择您可以使用的特定版本,请执行以下操作: