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

在Docker容器中用Maven构建可执行JAR时遇主类找不到问题

问题:Docker容器中Maven构建的JAR包无法找到主类

本地通过Maven构建的可执行JAR包能正常运行,但按照下述步骤在Docker容器内构建后,执行JAR包时出现错误:

Error: Could not find or load main class org.example.Main
Caused by: java.lang.ClassNotFoundException: org.example.Main

项目相关信息

本地项目结构

本地项目结构

Main类代码

package org.example;

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>maven-troubleshooting</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>org.example.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

本地操作流程(正常运行)

mvn clean package
# 输出...[INFO] BUILD SUCCESS
java -jar target/maven-troubleshooting-1.0-SNAPSHOT.jar
# 输出Hello world!

Dockerfile内容

FROM maven:3.8.6-openjdk-11
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY pom.xml /usr/src/app
COPY src /usr/src/app

Docker操作流程

docker build . -t simplified-mvn-troubleshooting
docker run -it simplified-mvn-troubleshooting bash
# 进入容器后执行
mvn clean package
# 输出...[INFO] BUILD SUCCESS
java -jar target/maven-troubleshooting-1.0-SNAPSHOT.jar
# 出现上述错误

问题原因及修复方案

核心错误

Dockerfile中COPY src /usr/src/app的写法有误:这条命令会把本地src目录下的所有文件直接复制到容器的/usr/src/app根目录,而不是创建/usr/src/app/src子目录。

Maven要求源码必须放在src/main/java路径下,容器内构建时找不到正确的源码位置,导致编译后的Main.class文件要么没被生成,要么没有被正确打包进JAR,最终触发类找不到的错误。

修复Dockerfile

修改COPY命令,确保本地的src目录被完整复制到容器工作目录的src子目录下:

FROM maven:3.8.6-openjdk-11
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY pom.xml .
COPY src ./src

验证修复

重新构建镜像并进入容器执行命令:

docker build . -t simplified-mvn-troubleshooting
docker run -it simplified-mvn-troubleshooting bash
mvn clean package
java -jar target/maven-troubleshooting-1.0-SNAPSHOT.jar

此时JAR包应该能正常输出Hello world!。

可选优化:多阶段构建

如果希望减少镜像体积并直接运行JAR包,可以使用Docker多阶段构建,避免手动进入容器操作:

# 第一阶段:构建JAR包
FROM maven:3.8.6-openjdk-11 AS builder
WORKDIR /usr/src/app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# 第二阶段:运行JAR包
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /usr/src/app/target/maven-troubleshooting-1.0-SNAPSHOT.jar app.jar
CMD ["java", "-jar", "app.jar"]

构建并运行:

docker build . -t maven-troubleshooting
docker run maven-troubleshooting

内容的提问来源于stack exchange,提问作者pippa dupree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:15:32