BitBucket流水线jib-maven-plugin推GCR后Cloud Run报ClassNotFoundException
排查步骤与根因判断
报错说明
你遇到的报错是JVM启动时无法找到指定的主类:
Error: Could not find or load main class com.sdas.demo.sd.Application Caused by: java.lang.ClassNotFoundException: com.sdas.demo.sd.Application
由于本地构建的镜像可正常部署到Cloud Run,仅BitBucket流水线构建的镜像报错,可排除主类配置本身的逻辑问题,根因为流水线构建环境和本地环境的差异。
分步排查方案
1. 检查流水线构建基础环境差异
分别在本地和BitBucket流水线中执行以下命令,对比输出结果:
# 检查JDK和Maven版本 java -version mvn -v # 检查代码拉取是否完整,主类文件是否存在 ls -la src/main/java/com/sdas/demo/sd/Application.java # 检查Maven激活的profile mvn help:active-profiles
重点确认流水线是否存在JDK版本不兼容、代码拉取不全、额外profile激活导致主类被排除的问题。
2. 对比不同环境构建出的镜像内容
分别对本地和流水线构建的镜像执行以下命令,检查主类文件是否存在:
docker run --rm --entrypoint=ls eu.gcr.io/sdas-demo-dev/temp-service /app/classpath/com/sdas/demo/sd/
- 如果流水线构建的镜像中不存在
Application.class:说明是流水线的编译阶段问题,主类没有被编译打包到镜像中 - 如果存在
Application.class:说明是jib的主类配置在流水线环境未生效
3. 强制指定主类参数验证
直接在流水线的jib构建命令中显式传入主类参数,避免jib未读取到pom配置的问题,修改后的命令如下:
mvn clean compile com.google.cloud.tools:jib-maven-plugin:3.1.4:build -Dimage=eu.gcr.io/sdas-demo-dev/temp-service -Djib.mainClass=com.sdas.demo.sd.Application
如果修改命令后部署正常,说明是流水线环境下jib插件未正确读取pom中的mainClass配置,可固定用命令行传参的方式解决。
根因归类
该问题不属于代码层面的类路径配置问题,属于构建环境差异问题,所有排查方向均围绕本地和BitBucket流水线的环境、构建过程差异展开即可。
内容的提问来源于stack exchange,提问作者Soumik Das
相关产品推荐
相关产品推荐

