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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:05:57