【问题标题】:Tomcat doesn't recognise Java UpgradeTomcat 无法识别 Java 升级
【发布时间】:2022-11-17 17:02:30
【问题描述】:

我最近将 Java 版本从 11 升级到 17。但是每当我运行 .war 文件时,我都会收到以下错误:

java.lang.UnsupportedClassVersionError: somePackage/SomeClass 已由较新版本的 Java 运行时(类文件版本 61.0)编译,此版本的 Java 运行时只能识别 55.0 以下的类文件版本(无法加载类 [somePackage.某类])

为了验证 Tomcat 是否使用了正确的版本,我这样做了:

[root@ip-172-31-21-71 apache-tomcat-9.0.58]# java -cp lib/catalina.jar org.apache.catalina.util.ServerInfo
Server version: Apache Tomcat/9.0.58
Server built:   Jan 15 2022 14:37:38 UTC
Server number:  9.0.58.0
OS Name:        Linux
OS Version:     4.14.214-160.339.amzn2.x86_64
Architecture:   amd64
JVM Version:    17.0.5+8-LTS
JVM Vendor:     Amazon.com Inc.
[root@ip-172-31-21-71 apache-tomcat-9.0.58]# ps -ef | grep tomcat
root     12088 11400  0 08:49 pts/0    00:00:00 grep --color=auto tomcat
root     15642     1  1 Nov16 ?        00:12:09 /opt/jdk-17.0.5/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-9.0.58/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dfile.encoding=UTF-8 -Xms128m -Xmx700m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/apache-tomcat-9.0.58/bin/bootstrap.jar:/opt/apache-tomcat-9.0.58/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-9.0.58 -Dcatalina.home=/opt/apache-tomcat-9.0.58 -Djava.io.tmpdir=/opt/apache-tomcat-9.0.58/temp org.apache.catalina.startup.Bootstrap start
[root@ip-172-31-21-71 apache-tomcat-9.0.58]# /opt/jdk-17.0.5/bin/java --version
java 17.0.5 2022-10-18 LTS
Java(TM) SE Runtime Environment (build 17.0.5+9-LTS-191)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.5+9-LTS-191, mixed mode, sharing)

甚至${JAVA_HOME} 也指向正确的目录。一切都在当地运作良好。我不知道我错过了什么。任何建议,将不胜感激。提前致谢。

【问题讨论】:

  • 您的(实际)tomcat 服务是如何启动的? (我的猜测是它没有使用你的交互式 shell 的环境变量......)
  • 在 bin/ => ./startup.sh 中启动 tomcat。 setenv.sh 文件中有一些环境变量,但没有关于 java 版本的信息
  • 请don't upload text as image。编辑您的问题以包含文本形式的所有信息 - 考虑使用编辑器的格式设置选项。另见How to Ask。
  • 那么你是手动运行tomcat的startup.sh文件吗?或者你是从 init / systemd / 什么运行它的?
  • 是的,我正在手动运行它。

标签: java tomcat tomcat9


【解决方案1】:

好吧...因为您正在手动运行startup.sh...

startup.sh 调用catalina.sh start。 catalina.sh脚本使用JRE_HOME或JAVA_HOME环境变量。但它负载如果可以找到它们,通过采购 setenv.sh 脚​​本来获取它们。

所以我敢打赌,setenv.sh 是显着的 JRE_HOME 或 JAVA_HOME 设置所在的位置。

但好消息是,所有这些文件都只是 shell 脚本,因此您可以阅读它们以弄清楚它到底发生了什么。如果看不懂shell脚本,可以在各自的脚本中加上set -x看他们在做什么!


顺便一提:

为了验证 Tomcat 是否使用了正确的版本,我这样做了: $ java -cp lib/catalina.jar org.apache.catalina.util.ServerInfo

那不是一个有效的测试。您必须弄清楚脚本如何选择它们正在使用的 JRE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2016-10-22
    • 2010-12-09
    相关资源
    最近更新 更多