运行Spring Boot微服务Docker镜像时遇No main manifest错误求助
SpringBoot微服务容器化运行报错:找不到主类的解决办法
问题
SpringBoot+Maven微服务,Docker镜像构建成功,但容器启动时报错:Error: Could not find or load main class com.example.demo.DemoApplication。已在主pom.xml添加spring-boot-maven-plugin,问题仍存在。
相关配置
- Dockerfile:
FROM openjdk:17-jdk-slim VOLUME /tmp COPY target/demo-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"]
- 项目结构:父工程下包含多子模块,主应用模块为
demo,主类DemoApplication路径src/main/java/com/example/demo/ - 主pom.xml插件配置:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.0.5</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>
解决步骤
1. 验证本地Jar包是否可执行
先排除打包问题:
- 执行
mvn clean package后,在本地运行java -jar target/demo-0.0.1-SNAPSHOT.jar,看能否正常启动。如果本地也报错,说明打包未生成可执行Jar。 - 查看Jar包结构:运行
jar tf target/demo-0.0.1-SNAPSHOT.jar,检查是否存在BOOT-INF/classes/com/example/demo/DemoApplication.class,同时查看META-INF/MANIFEST.MF是否包含:
缺少这两行说明插件未正确打包。Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: com.example.demo.DemoApplication
2. 确保插件配置在主应用模块
多模块项目中,spring-boot-maven-plugin必须配置在主应用模块(demo)的pom.xml中,而非仅在父pom的<pluginManagement>里。子模块pom需明确引入:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
3. 修正Dockerfile的Jar包路径
部分情况下,插件会生成带-exec后缀的可执行Jar,检查target目录下的Jar名称,修改Dockerfile:
COPY target/demo-0.0.1-SNAPSHOT-exec.jar app.jar
或用通配符简化(确保target下只有一个可执行Jar):
COPY target/*.jar app.jar
4. 正确执行多模块打包
如果从父工程打包,需指定主应用模块:
mvn clean package -pl demo -am
-pl demo指定打包demo模块,-am自动构建依赖模块,避免生成普通Jar。
内容的提问来源于stack exchange,提问作者Thiago Salgado
相关产品推荐
相关产品推荐

