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

Ind*_*ake 5 java java-8 docker spring-boot

我使用 Springboot 创建了一个 Web 应用程序,现在我将对其进行 dockerize 并将其上传到 docker hub。所以我的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"]
Run Code Online (Sandbox Code Playgroud)

在我的目标内部创建之后,.jar我使用以下命令构建 docker 映像,

docker build -t kubernatesimage
Run Code Online (Sandbox Code Playgroud)

它成功构建了 docker 映像,当我运行时,docker images我可以看到创建的映像。但在将其上传到 docker hub 之前,我需要运行并检查,以便我正在执行,

docker run -it  -p 4000:80 kubernatesimage 
Run Code Online (Sandbox Code Playgroud)

这会返回以下异常,

线程“main”中出现异常 java.lang.UnsupportedClassVersionError:guru/springframework/SpringBootWebApplication 已由较新版本的 Java 运行时(类文件版本 55.0)编译,此版本的 Java 运行时仅识别最高 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
Run Code Online (Sandbox Code Playgroud)

但我仍然不知道我需要做什么来解决这个问题。我在 my 中提到了 openjdk:8,Dockerfile我运行java -version以获取本地 JDK 版本,它返回了

java version "1.8.0_271"
Run Code Online (Sandbox Code Playgroud)

那么我是否需要更改本地计算机中的java版本或更改我的Dockerfile

Asc*_*hay 5

您的应用程序不应该以任何一种方式运行,因为它 docker run -it -p 4000:80 kubernatesimage 应该是 docker run -it -p 4000:8080 kubernatesimage

现在关于这个问题:您的运行时版本是8:因为您的dockerfile是“FROM openjdk:8”,所以您的应用程序将在java 8环境=>版本52中运行..并且您已将应用程序编译为jar文件“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>
Run Code Online (Sandbox Code Playgroud)

另一个修复是将 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"]
Run Code Online (Sandbox Code Playgroud)

注意:您仍然可以在更大的运行时环境中运行较小的编译后的java版本,即在java 11运行时环境上运行编译后的8java版本

我希望我有帮助