我有一个maven项目。它是用Java 16编写的。我安装了Java 16 JDK。
当我用dockerfile构建它时,一切都正常,但当我运行docker并转到我的项目url时,我得到了一个“不受支持的类文件主版本60”。
可以在tomcat或其他东西上运行java 16项目吗?
这是我的一些文件:
DockerFile文件:
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"]
还有我的pom。xml:
<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>
Tomcat日志:
Type Rapport d'exception
message Servlet.init() for servlet [demo-serlvet] threw exception
description Le serveur a rencontré une erreur interne qui l'a empêché de satisfaire la requête.
exception
javax.servlet.ServletException: Servlet.init() for servlet [demo-serlvet] threw exception
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1723)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:831)
cause mère
java.lang.IllegalArgumentException: Unsupported class file major version 60
jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:201)
jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:179)
jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:165)
jersey.repackaged.org.objectweb.asm.ClassReader.<init>(ClassReader.java:289)
org.glassfish.jersey.server.internal.scanning.AnnotationAcceptingListener.process(AnnotationAcceptingListener.java:148)
org.glassfish.jersey.server.ResourceConfig.scanClasses(ResourceConfig.java:888)
org.glassfish.jersey.server.ResourceConfig._getClasses(ResourceConfig.java:842)
org.glassfish.jersey.server.ResourceConfig.getClasses(ResourceConfig.java:751)
org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1178)
org.glassfish.jersey.server.ResourceConfig$RuntimeConfig.<init>(ResourceConfig.java:1151)
org.glassfish.jersey.server.ResourceConfig.createRuntimeConfig(ResourceConfig.java:1147)
org.glassfish.jersey.server.ApplicationHandler$RuntimeConfigConfigurator.init(ApplicationHandler.java:182)
org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$0(ApplicationHandler.java:290)
java.base/java.util.Arrays$ArrayList.forEach(Arrays.java:4203)
org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:290)
org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:259)
org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154)
org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:346)
javax.servlet.GenericServlet.init(GenericServlet.java:158)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1723)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:831)
note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de ce serveur.
docker执行后从api容器登录:
root@df012b95a989:/usr/local/tomcat# java -version
openjdk version "16.0.2" 2021-07-20
OpenJDK Runtime Environment (build 16.0.2+7-67)
OpenJDK 64-Bit Server VM (build 16.0.2+7-67, mixed mode, sharing)
正如Joachim在评论中所指出的,您的问题是由Jersey打包的ASM版本造成的。这类似于关于Spring的这个问题。
查找ASM支持的Java最高版本的最简单方法是查看源代码:
至于3。x分支,所有版本都支持Java 16,而最新版本(3.0.2)也支持即将推出的Java 17。
我在Ubuntu上有一个Gradle项目。它是用Java 14编写的。我安装了Java 14 JDK。当我从命令行构建它时,一切都正常,但没有人想使用命令行!当我在IntelliJ IDEA中打开它时,它会抛出一个错误: 接下来是一个冗长、无用的堆栈跟踪,其中包含很多关于Groovy的信息。(该项目不是Groovy项目;这是一个Java项目。) 主要版本60指的是Java 16,本项目未使用该版本
我正在创建一个Java RESTAPI Spring Boot应用程序,它使用spark从服务器获取一些数据。当我尝试从数据集转换为列表时,它失败了。 我尝试了jdk8和jdk11编译和执行代码,但我得到了相同的'java.lang.IllegalArgumentException:不支持的类文件主要版本55',在过去,我通过更新Java版本解决了这个问题,但它不为此工作。 我正在使用: > JD
问题内容: 我有这个错误 如何解决? 我有这样的POM 项目有很多文字,因此需要Java 13。 问题答案: 在pom.xml中更改Spring引导版本可以为我解决此问题。
当我构建我的应用程序时,我得到了以下错误。任何帮助都将不胜感激。 根:生成。格拉德尔 settings.gradle 应用程序:生成。格拉德尔 失败:生成失败,出现异常*其中:设置文件“/Users/Documents/android/MyApplication5/Settings。gradle“*出了什么问题:无法编译设置文件”//Users/anand/Documents/android/My
我正在尝试运行一个颤振应用程序,在尝试时出现了这个错误,我所做的是我想在没有android studio的情况下运行颤振应用程序,所以我下载了android SDK和JDK 17,在我运行颤振医生后,它告诉我一切都很好,我尝试运行,它给了我这个错误: 所以我尝试了一个旧版本的JDK,它给了我另一个错误,所以我看到了使用JDK 17运行的第三个解决方案,那就是降级gradle中的gradle。属性,
配置:Java:16 Gradle:7.2 Jacoco:0.8.4 当我将我的项目从openJDK8升级到openJDk16时,我看到以下问题: “原因:java.lang.IllegalArgumentException:不支持的类文件主版本60” 还有以下问题: java.lang.instrument.IllegalClassFormatException:检测sun/security/e