构建Spring Boot Docker镜像时出现「找不到主类」错误该如何解决?
问题排查与解决方案
1. 确认JAR包类型是否正确
你当前复制的DWH_WebServices.jar大概率是普通编译JAR,而非Spring Boot的可执行Fat Jar。普通JAR仅包含项目类文件,缺少依赖和启动配置,会导致主类找不到。
- 解决:通过Maven重新打包生成Fat Jar,执行命令:
打包后的可执行JAR默认在mvn clean packagetarget目录下,文件名格式一般为项目名-版本号.jar,替换Dockerfile中的COPY路径为该JAR的实际路径。
2. 检查Dockerfile的JAR路径准确性
确认out/artifacts/DWH_WebServices_jar/DWH_WebServices.jar这个路径在Docker构建上下文(执行build命令的目录)中真实存在。如果IntelliJ的构建输出路径和你预期不符,会导致COPY失败,镜像中没有正确的JAR文件。
- 解决:
- 先在本地用
java -jar 路径/DWH_WebServices.jar测试JAR能否正常启动,排除JAR本身问题。 - 修改Dockerfile的COPY路径为正确位置,比如Maven打包后的路径:
COPY target/DWH_WebServices-1.0-SNAPSHOT.jar app.jar
- 先在本地用
3. 检查pom.xml的Spring Boot插件配置
确保pom.xml中包含正确的spring-boot-maven-plugin配置,该插件负责生成可执行Fat Jar:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 若自动检测主类失败,手动指定 --> <mainClass>com.business.dwh_webservices.DwhWebServicesApplication</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
4. 验证镜像内的JAR内容
可以临时启动容器检查JAR是否正确复制,以及主类是否存在:
# 启动临时容器进入shell docker run -it --rm --entrypoint sh <你的镜像ID> # 检查JAR内是否包含主类文件 jar tf /app.jar | grep com/business/dwh_webservices/DwhWebServicesApplication.class
如果无输出,说明JAR本身缺失主类,或COPY操作未正确复制文件。
内容的提问来源于stack exchange,提问作者Louis Chopard
相关产品推荐
相关产品推荐

