问题描述
我有一个 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。