如何修复tomcat9中“不支持的类文件主要版本60”?

问题描述

我有一个 Maven 项目。它是用 Java 16 编写的。我安装了 Java 16 JDK。

当我使用 dockerfile 构建它时,一切正常,但是当我运行 docker 并继续我的项目 url 时,我得到了一个“不受支持的类文件主要版本 60”。

可以在 tomcat 或其他东西上运行 java 16 项目吗?

这是我的一些文件

Docker 文件

or iata_code like '%tehran%'

还有我的 pom.xml:

and b.city like '%tehran%' or iata_code like '%tehran%'

Tomcat 日志:

FROM maven:3.8.1-openjdk-17 as builder
RUN mkdir -p /root/.m2 && mkdir /root/.m2/repository
copY . /app/
RUN cd /app && mvn clean package -Dmaven.test.skip=true

FROM tomcat:9.0-jdk16-openjdk
copY --from=builder /app/target/demo.war /usr/local/tomcat/webapps
ENV CATALINA_OPTS=""
EXPOSE 8080
CMD ["catalina.sh","run"]

在 docker exec 后从 api 容器登录

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.demo</groupId>
    <artifactId>demo</artifactId>
    <packaging>war</packaging>
    <version>0.0.1</version>
    <name>demo</name>
    <url>http://maven.apache.org</url>

    <properties>
        <!-- Dependencies properties -->
            <!-- ... -->
        <!-- Project build properties -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
        <maven-dependency-plugin.version>3.1.1</maven-dependency-plugin.version>
        <maven.resources.plugin>3.0.1</maven.resources.plugin>
        <maven-war-plugin.version>3.2.2</maven-war-plugin.version>
        <java.version>16</java.version>
    </properties>

    <dependencies>
        <!-- ... -->
    </dependencies>
    <build>
        <finalName>demo</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>${java.version}</release>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
            </plugin>
            <!-- ... -->
        </plugins>
    </build>
</project>

解决方法

正如 Joachim 在评论中所指出的,您的问题是由 Jersey 打包的 ASM 版本引起的。它类似于关于 Spring 的 this question

找到 ASM 支持的 Java 最高版本的最简单方法是查看源代码:

  • Jersey 2.34 最高支持 Java 17(参见 source code),
  • Jersey 2.33 最高支持 Java 16,
  • Jersey 2.30 最高支持 Java 15(带有针对 Java 15 的警告),
  • Jersey 2.29 最高支持 Java 14(带有针对 Java 14 的警告),
  • Jersey 2.28(第一个 EE4j 版本)最高支持 Java 12。

至于 3.x 分支,所有版本都支持 Java 16,而最新的 (3.0.2) 也支持即将推出的 Java 17。