在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
相关产品推荐
相关产品推荐

