Docker化Java/Gradle项目时主类找不到问题求助
问题:Spring Boot多模块Gradle项目Docker化后主类找不到
问题场景
基于Gradle的多模块Java项目,目标是Docker化,执行./gradlew build构建无报错,但直接运行java -jar build/libs/project.jar或Docker镜像时,出现以下错误:
Error: Could not find or load main class src.main.java.path.to.my.class.MyMainClass Caused by: java.lang.ClassNotFoundException: src.main.java.path.to.my.class.MyMainClass
补充:已确认project.jar内的META-INF/MANIFEST.MF配置了Main-Class: path.to.my.class.MyMainClass。
解决方案
1. 错误根源
你当前打包的是根项目的空jar,而非application模块的可执行jar:
- 根项目仅作为多模块聚合容器,本身无业务代码,其
jar任务生成的project.jar不包含主类字节码; application模块已应用org.springframework.boot插件,该插件会自动生成包含所有依赖的可执行jar,无需在根项目手动配置Main-Class。
2. 具体修正步骤
移除根项目的无效jar配置
删除根目录build.gradle中的这段代码:jar { manifest { attributes 'Main-Class': 'path.to.my.class.MyMainClass' } }构建正确的可执行jar
执行Spring Boot插件专属构建任务,生成包含依赖的可执行jar:./gradlew :application:bootJar构建完成后,可执行jar会生成在
application/build/libs/目录下,文件名格式一般为application-{版本号}.jar。调整Dockerfile的复制路径
修改Dockerfile中的COPY指令,指向application模块生成的可执行jar:FROM openjdk:17.0.2 WORKDIR /app COPY ./application/build/libs/application-*.jar /app/project.jar EXPOSE 8080 CMD ["java", "-jar", "project.jar"]本地验证
先在本地运行生成的可执行jar,确认能正常启动:java -jar application/build/libs/application-xxx.jar验证通过后再构建并运行Docker镜像。
3. 额外说明
- 根项目的
./gradlew build会构建所有模块,但根项目生成的build/libs/project.jar仅为聚合项目的空jar,不包含任何业务代码和依赖; - Spring Boot的
bootJar任务会生成"fat jar",包含当前模块代码及所有依赖,是Spring Boot项目的标准可执行jar格式。
内容的提问来源于stack exchange,提问作者Gollo
相关产品推荐
相关产品推荐

