什么决定了在ubuntu上使用哪个版本的java tomcat?

dzjeubhm  于 2021-10-10  发布在  Java
关注(0)|答案(2)|浏览(314)

我有两台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

测试版。

puruo6ea

puruo6ea1#

在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 如果它被选中,
否则,将使用java的最高版本(最多11个)。

hgb9j2n6

hgb9j2n62#

通常,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

相关问题