【问题标题】:What determines which version of Java Tomcat uses on Ubuntu?什么决定了在 Ubuntu 上使用哪个版本的 Java Tomcat?
【发布时间】: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"

标签: java tomcat systemd


【解决方案1】:

在 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。

【讨论】:

  • 这正是我需要知道的,谢谢!一个绿色复选标记似乎还不够。
【解决方案2】:

通常,Ubuntu 会选择默认使用的 Java。你可以这样找到它:

$ which java
/usr/bin/java
$/usr/bin/java --version
openjdk 11.0.11 2021-04-20                                                                                                                                                         
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.18.04)                                                                                                                
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.18.04, mixed mode, sharing)     

您还可以使用以下方法检查系统中可用的替代方案:

$ update-java-alternatives -l 

这将列出所有已安装的 java。

要选择您可以使用的特定版本:

$ sudo update-alternatives --config java

【讨论】:

  • 谢谢,我不知道这个,结果发现两个 Ubuntu 安装有不同的默认 Java 符号链接。但是,即使按照您建议的方式将两台服务器都设置为使用 Java 8,并重新启动 Tomcat,Tomcat 仍然使用/usr/lib/jvm/default-java/bin/java 作为其 Java 版本,并且仍然符号链接到 Java 11。似乎仍然存在特定于 Tomcat 的差异两台服务器之间。
  • 查看本文档的第 3.4 项:tomcat.apache.org/tomcat-9.0-doc/RUNNING.txt。您必须在setenv.sh 中设置 JAVA_HOME。例如:JAVA_HOME="/usr/lib/jvm/path-to-your-java8"
  • 我在两台服务器上都没有活动的setenv.sh(据我所知),所以这不能解释。我知道我可以使用setenv.sh,但这个问题仅限于确定现在存在的差异的原因。
  • 可能另一个应用程序(可能是 java 安装程序)已经为系统设置了 JAVA_HOME。试试这个:echo $JAVA_HOME。如果打印路径,请检查版本:path-from-the-echo/bin/java -version
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2014-11-20
  • 1970-01-01
相关资源
最近更新 更多