You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:12:40