Docker运行SpringBoot项目报错:无法找到主类src.MyApplication
问题:Docker运行SpringBoot容器时找不到主类
src.MyApplication 我有一个基于Java、Maven和SpringBoot开发的后端项目,在VSCODE中编写代码并创建了专用Dockerfile,打包jar后构建镜像成功,但运行容器时出现错误:
Error: Could not find or load main class src.MyApplication Caused by: java.lang.ClassNotFoundException: src.MyApplication
项目相关文件及结构
Dockerfile
FROM maven:3.8.1-openjdk-11 AS build WORKDIR /usr/src/app COPY pom.xml . COPY src ./src RUN mvn package ENTRYPOINT ["java","-jar","target/my-app-1.0.0.jar"]
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>src</groupId> <artifactId>my-app</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.10.RELEASE</version> </parent> <properties> <start-class>src.MyApplication</start-class> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.1.6</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <mainClass>src.MyApplication</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
MyApplication.java
package src; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
项目目录结构
. ├── src | └──controllers | │ └──controller.java | └──models | │ └──classA.java | | └──classB.java | └──services | | └──service.java | └──MyApplication.java ├── Dockerfile ├── pom.xml
解决方案
1. 修正Maven目录结构(核心问题)
Maven遵循约定优于配置,Java源码必须放在src/main/java目录下,当前直接放在src下会导致编译后的class文件路径不匹配。调整后的目录结构应为:
. ├── src | └──main | └──java | └──src | ├──controllers | │ └──controller.java | ├──models | │ └──classA.java | | └──classB.java | ├──services | | └──service.java | └──MyApplication.java ├── Dockerfile ├── pom.xml
2. 修复SpringBoot版本依赖冲突
pom.xml中父依赖是SpringBoot 1.5.10,但引入的依赖是3.1.0版本,版本严重不兼容。统一升级父依赖到3.1.0:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.0</version> </parent>
同时,SpringBoot 3.x要求Java版本至少为17,修改编译版本:
<properties> <start-class>src.MyApplication</start-class> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties>
3. 替换为SpringBoot Maven插件
SpringBoot插件会自动处理可执行jar的打包逻辑,无需手动配置maven-jar-plugin,替换build部分:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
4. 优化Dockerfile(可选)
使用多阶段构建减小镜像体积,运行阶段用轻量的OpenJDK镜像:
# 构建阶段 FROM maven:3.8.5-openjdk-17 AS build WORKDIR /usr/src/app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests # 运行阶段 FROM openjdk:17-jdk-slim WORKDIR /app COPY --from=build /usr/src/app/target/my-app-1.0.0.jar ./app.jar ENTRYPOINT ["java","-jar","app.jar"]
5. 验证并重新构建
本地先执行mvn clean package,运行java -jar target/my-app-1.0.0.jar确认服务能正常启动,再重新构建Docker镜像:
docker build -t app . docker run -p 8080:8080 app
内容的提问来源于stack exchange,提问作者maia
相关产品推荐
相关产品推荐

