【问题标题】:Application has been compiled by a more recent version of the Java Runtime (class file version 55.0), this versions up to 52.0应用程序已由更新版本的 Java Runtime(类文件版本 55.0)编译,此版本最高为 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 管道以找出问题所在。我很确定上面的代码是正确的,如果在本地构建和运行它会起作用。

标签: spring-boot docker


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    FROM adoptopenjdk/openjdk11:jre-11.0.9.1_1-alpine

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

    【讨论】:

      猜你喜欢
      • 2019-10-07
      • 2022-06-15
      • 2020-01-27
      • 2022-01-23
      • 2020-12-26
      • 1970-01-01
      • 2020-03-27
      • 2021-12-31
      • 2018-05-07
      相关资源
      最近更新 更多