Caused by: java.lang.ClassNotFoundException: org.springframework.boot.loader.JarLauncher

  1. 问题现象
  2. 问题分析
  3. 解决方案
  4. Reference

问题现象

今天同事再升级框架后(spring-cloud 2022.0.4 -> 2023.0.0)(spring-boot 3.1.6 -> 3.2.0)

同时因为 spring-boot 的版本问题, 需要将 maven 升级到 3.6.3+

maven version

升级后构建 jar 包和构建镜像都是正常的, 但是发布到测试环境就报错 Caused by: java.lang.ClassNotFoundException: org.springframework.boot.loader.JarLauncher

error log

问题分析

报错为 JarLauncher 找不到, 检查了 Jenkins 中的打包任务, 发现并没有编译报错, 同事直接使用打包任务中产生的 xx.jar, 可以正常运行.

说明在打包 Docker 镜像前都没有问题, 这时就想起来我们在打包镜像时, 先解压 xx.jar, 然后直接执行 org.springframework.boot.loader.JarLauncher, 所以很可能是升级后, 启动文件 JarLauncher 的路径变了.

为了验证我们的猜想, 我们得看一下实际容器内的文件结构, 但是这时容器一直报错导致无法启动, 不能直接通过 Rancher 查看文件结构, 我们可以通过文件拷贝的方式来解决, 如下:

# 下载有问题的镜像, 并且创建容器(不启动)
docker create -it --name dumy 10.188.132.123:5000/lemes-cloud/lemes-gateway:develop-202312111536 bash
# 直接拷贝容器内的我们想要看的目录
docker cp dumy:/data .

到本地后, 就可以通过合适的工具查找 JarLauncher 文件, 我这里通过 vim 来寻找, 如下图:

JarLauncher Path

发现比原来多了一层目录 launch, 所以问题就发生在这里了.

解决方案

我们在打包脚本 JenkinsCommon.groovy 中根据当前打包的 JDK 版本来判断使用的启动类路径, 如下:

Jenkins

再次打包, 应用正常启动.

Reference

JarLauncher


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com

×

喜欢就点赞,疼爱就打赏