【问题标题】:java spingboot microservice deployment on aks throws UnsupportedClassVersionErroraks 上的 java spring boot 微服务部署抛出 UnsupportedClassVersionError
【发布时间】:2020-06-01 14:24:30
【问题描述】:

在尝试在 aks 上部署 java springboot 微服务时,我不断给我 UnsupportedClassVersionError。我正在使用 "kubectl apply -f file.yaml" 命令来应用部署。即使现在编译为正确的编译器版本,它仍然抱怨相同。不知道我在哪里失踪。

第一次尝试
- 使用 oracle openjdk 11 编译
- 使用 javap -verbose MyApplication 检查编译的类版本 | findstr "major"
  控制台输出 - 主要版本:55
- 部署到 aks 失败

第二次尝试
- 使用 oracle jdk 1.8 编译
- 使用'javap -verbose MyApplication | 检查编译的类版本。 findstr "major" '
  控制台输出 - 主要版本:52
- 部署到 aks 失败

两种部署通用
- 使用命令“kubectl apply -f myapp.yaml”部署在 aks 集群上
- 收到相同的错误,即,

> Exception in thread "main" java.lang.UnsupportedClassVersionError:
> MyApplication 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
>         at java.lang.ClassLoader.defineClass1(Native Method)
>         at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
>         at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
>         at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
>         at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
>         at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
>         at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
>         at java.security.AccessController.doPrivileged(Native Method)
>         at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
>         at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:92)
>         at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
>         at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)
>         at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
>         at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
>         at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)


请求帮助

问候

【问题讨论】:

  • 您使用的是什么版本的 Spring Boot?确保您使用的是支持正确 jdk 的 Spring Boot 版本
  • 虽然您可能已经使用 Java 8 编译器编译了代码,但运行时类路径似乎仍然包含使用 Java 11 编译的类。
  • Thx @Stephen,但是在第二次尝试中,我验证了编译后的类主版本,它显示的是 52 而不是 55。当我在本地 docker 中尝试时,这会发生什么变化,与部署相比,它运行平稳在 aks 上。
  • 嗨解决了这个问题。部署的 pod 没有拉取最新版本的映像。使用 imagePullPolicy:始终添加到 yaml 清单并强制使用 kubectl replace --force 选项强制重新创建部署和服务,它是从最新(新)映像部署的,而不是使用其缓存。谢谢

标签: java docker kubernetes


【解决方案1】:

默认拉取策略设置为IfNotPresent,这会告诉 Kubelet 跳过拉取镜像,如果它已经存在于正在调度 pod 的节点上。 如果您想强制图像始终被拉出,您可以执行以下操作:

  • 将容器的imagePullPolicy设置为Always
  • 省略imagePullPolicy 并使用:latest 作为要使用的图像的标签。
  • 省略imagePullPolicy 和要使用的图像的标签。
  • 启用AlwaysPullImages准入控制器。

请注意,您应避免使用:latest 标签,有关详细信息,请参阅Best Practices for Configuration

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2021-04-28
    • 2022-11-07
    • 2018-05-24
    • 2021-01-28
    • 1970-01-01
    • 2019-09-06
    相关资源
    最近更新 更多