繁体   English   中英

Docker 运行返回异常:应用程序已由 Java 运行时的更新版本编译

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM