gpt4 book ai didi

java - 什么决定了在 Ubuntu 上使用哪个版本的 Java Tomcat?

转载 作者:行者123 更新时间:2023-12-05 01:29:10 24 4
gpt4 key购买 nike

我有两台 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/的符号链接(symbolic link)java-1.11.0-openjdk-amd64/bin/java.

因此,服务器 Alpha 使用 Java 8,而服务器 Beta 使用 Java 11。它们应该是相同的,但有些地方明显不同。

此时明显的问题是,Tomcat 如何确定使用哪个版本的 Java?

1) 文档

我在 Tomcat configuration documentation 中找不到这个问题的答案,并且文档中没有其他顶级主题似乎与此问题相关。

2) 堆栈溢出

这个堆栈溢出 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

测试版。

最佳答案

在 Debian 10 的衍生版本上,例如 Ubuntu 20.04,Tomcat 是通过位于 /usr/libexec/tomcat9/tomcat-start.sh 中的包装脚本启动的。如果您不自己设置 JAVA_HOME,则会在 /usr/libexec/tomcat9/tomcat-locate-java.sh 中执行启发式过程:

    # This function sets the variable JDK_DIRS
find_jdks()
{
for java_version in 11 10 9 8
do
for jvmdir in /usr/lib/jvm/java-${java_version}-openjdk-* \
/usr/lib/jvm/jdk-${java_version}-oracle-* \
/usr/lib/jvm/jre-${java_version}-oracle-* \
/usr/lib/jvm/java-${java_version}-oracle \
/usr/lib/jvm/oracle-java${java_version}-jdk-* \
/usr/lib/jvm/oracle-java${java_version}-jre-*
do
if [ -d "${jvmdir}" ]
then
JDK_DIRS="${JDK_DIRS} ${jvmdir}"
fi
done
done
}

# The first existing directory is used for JAVA_HOME
JDK_DIRS="/usr/lib/jvm/default-java"
find_jdks

# Look for the right JVM to use
for jdir in $JDK_DIRS; do
if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then
JAVA_HOME="$jdir"
fi
done
export JAVA_HOME

因此:

  • 如果 /usr/lib/jvm/default-java 存在,则选择它,
  • 否则使用最高(最多 11)版本的 Java。

关于java - 什么决定了在 Ubuntu 上使用哪个版本的 Java Tomcat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67941542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com