![](/img/trans.png)
[英]SearchServlet has been compiled by a more recent version of the Java Runtime
[英]Docker run returns an exception: Application has been compiled by a more recent version of the Java Runtime
我使用 Springboot 创建了一个 web 应用程序,现在我要将其 dockerize 并将其上传到 docker 集线器。 所以我的Dockerfile
是,
FROM openjdk:8
EXPOSE 8080
ADD target/spring-boot-web-0.0.1-SNAPSHOT.jar spring-boot-web-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","spring-boot-web-0.0.1-SNAPSHOT.jar"]
在我的目标内创建.jar
后,我正在使用以下命令构建 docker 图像,
docker build -t kubernatesimage
它成功构建了 docker 映像,当我运行docker images
时,我可以看到创建的映像。 但在将其上传到 docker 集线器之前,我需要运行并检查,所以我正在执行,
docker run -it -p 4000:80 kubernatesimage
这将返回以下异常,
Exception in thread "main" java.lang.UnsupportedClassVersionError: guru/springframework/SpringBootWebApplication has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
根据@Nithin 在此StackOverflow 问题中的回答,我发现这是由于版本不匹配和 java 版本代码导致的,
49 = Java 5
50 = Java 6
51 = Java 7
52 = Java 8
53 = Java 9
54 = Java 10
55 = Java 11
56 = Java 12
57 = Java 13
58 = Java 14
但是,我仍然不知道我需要执行什么来解决这个问题。 我在Dockerfile
中提到了 openjdk:8 并运行java -version
以获取本地 JDK 版本并返回
java version "1.8.0_271"
那么我需要在本地机器上更改 java 版本还是更改我的Dockerfile
?
您的应用程序不应该以任何一种方式运行,因为这个docker run -it -p 4000:80 kubernatesimage
它应该是docker run -it -p 4000:8080 kubernatesimage
Now concerning the issue: Your runtime version is 8: because of your dockerfile is "FROM openjdk:8" so your application will be running in java 8 environment =>version 52.. and you have compiled your application to jar file "spring- boot-web-0.0.1-SNAPSHOT.jar" 由另一个版本 55,即 java 11。所以你有 java 版本不匹配 => 关键是要确保编译和运行时都使用相同的 JDK。
一个建议的修复方法是在 pom.xml 文件中更改您的 java 版本
<project>
...
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
...
</project>
另一个修复方法是将 dockerfile 中的运行时版本更改为 java 11,无法将图像基于 openjdk:11 但是您可以使用它
FROM adoptopenjdk/openjdk11:alpine-jre
ARG JAR_FILE=target/*.jar
WORKDIR /opt/app
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
注意:您仍然可以在更大的运行时环境中运行较小的编译 java 版本,即在 java1 运行时环境中运行编译的 8 java 版本
我希望我有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.