天行健,君子以自强不息;地势坤,君子以厚德载物。
每个人都有惰性,但不断学习是好好生活的根本,共勉!
文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。
文章目录
- 1. 场景
- 2. 报错
- 3. 分析
- 3.1 打包阶段输出
- 3.2 gitlab-runner配置文件
- 3.3 dockerfile配置
- 4. 解决
1. 场景
k8s部署Java项目,pod启动失败
2. 报错
logs命令查看日志报错如下
[root@k8s-master ~]# kubectl logs sb-dplm-d765487f8-s5qfp -n ns-sb
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/springframework/boot/loader/JarLauncher has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0at 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 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
[root@k8s-master ~]#
截图
3. 分析
报错内容表示jni(java native interface)错误,检查是否安装然后重试
个人猜测就是java环境问题,无法获取或者使用这个接口去执行java程序
然后网上搜到的说的最多的就是java编译和运行的jdk版本不一致,而且他们都是在Windows上遇到的这个问题
对我这个情况来说,没办法解决
3.1 打包阶段输出
我尝试在.gitlab-ci.yml文件的两个阶段(打包,构建镜像)中执行查看java版本的命令
即在脚本命令中添加java -version和javac -version
在打包的阶段窗口看到如下,java版本为21.0.2
这里打包使用的java版本之所以是21.0.2是因为我在打包阶段未指定镜像,它默认会使用gitlab-runner注册时定义的镜像中的jdk
3.2 gitlab-runner配置文件
我去gitlab-runner的配置文件中查看配置文件的配置参数如下,可以看到这里使用的是maven镜像的最新版本,里面应该默认包含jdk最新版本,所以才会输出21.0.2这个版本
3.3 dockerfile配置
而在构建镜像时我构建镜像使用的dockerfile文件中的java镜像版本为jdk8的环境
综上,打包和构建镜像时的jdk版本不同,导致jar包执行出错
4. 解决
在打包阶段指定maven版本,使用adoptopenjdk/maven-openjdk8,此版本maven包含jdk8
配置后,重新执行
查看如下,jdk版本为1.8.0_222,与dockerfile中的jdk大版本
构建后重新部署pod即可
感谢阅读,祝君暴富!