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?
您的应用程序不应该以任何一种方式运行,因为它 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版本
我希望我有帮助
| 归档时间: |
|
| 查看次数: |
7095 次 |
| 最近记录: |