应用程序已由更新版本的 Java Runtime(类文件版本 55.0)编译,此版本最高为 52.0

Posted

技术标签:

【中文标题】应用程序已由更新版本的 Java Runtime(类文件版本 55.0)编译,此版本最高为 52.0【英文标题】:Application has been compiled by a more recent version of the Java Runtime (class file version 55.0), this versions up to 52.0 【发布时间】:2021-01-07 08:48:53 【问题描述】:

我正在尝试在 AWS 云中运行 docker 映像,因此在本地,使用 jdk-11.0.1 编译应用程序并像这样编写 docker 文件; 请注意,我没有在 AWS ec2 实例中安装任何 JDK,因为我已经在最终图像中包含了采用openjdk/openjdk11:latest 图像..

FROM adoptopenjdk/openjdk11:latest
ADD target/demo-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]
EXPOSE 8080

1)create the docker image
2)pushed the docker image to docker hub
3)when I run the docker container then getting below error.

线程“main”中的异常 java.lang.UnsupportedClassVersionError: com/example/demo/DemoApplication 已由更新版本的 Java Runtime(类文件版本 55.0)编译,此版本的 Java Runtime 仅识别类文件版本高达 52.0

【问题讨论】:

版本 55 是 JDK 11。正如您使用 JDK 11 编译时所期望的那样。版本 52 是 JDK 8。因此,即使您在 Docker 映像中包含了 OpenJDK 11,代码似乎也是使用 JDK 8 运行,因此失败。 那有什么解决办法呢? 您的 docker 镜像包含 JDK 8 而不是 JDK 11。检查整个 CI/CD 管道以找出问题所在。我很确定上面的代码是正确的,如果在本地构建和运行它会起作用。 【参考方案1】:

很可能 java 已在本地更新,因此您正在使用与您想象的不同的版本进行编译。或者本地版本与“adoptopenjdk/openjdk11:latest”不同。

我建议您使用多阶段构建,以便您的类始终针对相同的 java 版本进行编译。

如何编写构建阶段取决于您的环境,因此我没有足够的信息来发布示例。但基本上你需要在构建阶段复制你在本地所做的一切。然后你只需将 jar 复制到最后一个阶段。这将永远有效。

【讨论】:

什么是多阶段构建? 你可以查看这个答案:***.com/questions/27767264/…【参考方案2】:

尝试将您的 openjdk 版本更改为最新版本,即 FROM:openjdk:12 为我工作,因为我使用的是最新的 java 版本,在运行时使用相应的 openjdk 版本来匹配

【讨论】:

【参考方案3】:

为避免此类问题,建议对图片非常具体

FROM adoptopenjdk/openjdk11:jre-11.0.9.1_1-alpine

对于这种最佳实践,我建议阅读我在寻找解决方案时发现的 this 文章。

【讨论】:

以上是关于应用程序已由更新版本的 Java Runtime(类文件版本 55.0)编译,此版本最高为 52.0的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 构建失败并显示“org/eclipse/jgit/storage/file/FileRepositoryBuilder 已由 Java 的更新版本编译”

openwrt该文件已由包提供怎么解决

Eclipse无法正常启动,弹出对话框内容为 A Java Runtime...

Eclipse无法正常启动,弹出对话框内容为 A Java Runtime...

Ubuntu执行jar文件[重复]

不可转换的类型;无法将“io.cucumber.java.Scenario”转换为“cucumber.runtime.ScenarioImpl”