Docker Cloud自动化构建Maven项目报错:找不到Jar文件如何解决?
解决Docker构建Maven项目时Jar文件找不到的问题
你的问题核心是Dockerfile的写法存在几个关键错误,导致构建过程中要么没生成Jar文件,要么无法访问到它,我帮你拆解问题并给出修复方案:
问题根源
- 重复的
FROM指令:你写了两个FROM,Docker会直接以第二个maven:3.5.2-jdk-8-slim作为基础镜像,完全忽略第一个,这不是正确的多阶段构建用法。 CMD ['mvn package']不生效:CMD是容器启动时才会执行的命令,镜像构建阶段根本不会运行这条指令,所以target目录和Jar文件自然不会生成。ADD的文件不在构建上下文:ADD是从你运行docker build的本地目录(构建上下文)复制文件,如果本地没提前执行mvn package生成Jar,或者构建上下文里没有target文件夹,Docker肯定找不到这个文件。
修复方案
给你两种实用的修复方式,按需选择:
方案1:本地先构建Jar,再打包镜像(适合本地有Maven环境)
- 先在项目根目录执行:
mvn clean package
确保target/app-0.1.0-SNAPSHOT.jar已经生成。
2. 修改Dockerfile,去掉无效指令,只保留运行Jar的必要配置:
FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD target/app-0.1.0-SNAPSHOT.jar app.jar RUN sh -c 'touch /app.jar' ENV JAVA_OPTS="" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
- 在项目根目录运行构建命令:
docker build -t your-app-image .
此时构建上下文包含target目录,ADD就能顺利找到Jar文件。
方案2:多阶段构建(推荐,无需本地Maven环境)
这种方式让Docker全程完成Maven构建和镜像打包,适合CI/CD流水线或者本地不想装Maven的场景:
修改Dockerfile为多阶段构建,分两步完成:
# 第一阶段:用Maven镜像构建Jar包 FROM maven:3.5.2-jdk-8-slim AS builder WORKDIR /app # 复制pom.xml和源码到容器内 COPY pom.xml . COPY src ./src # 执行Maven打包(-DskipTests可以跳过测试,加快构建速度) RUN mvn clean package -DskipTests # 第二阶段:用轻量JDK镜像运行Jar包 FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp # 从第一阶段的构建结果中复制Jar包 COPY --from=builder /app/target/app-0.1.0-SNAPSHOT.jar app.jar RUN sh -c 'touch /app.jar' ENV JAVA_OPTS="" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
然后直接运行docker build -t your-app-image .,Docker会自动完成构建流程,不需要本地提前执行Maven命令。
小提示
- 注意Docker指令的引号格式:JSON格式的指令(比如
CMD、ENTRYPOINT)需要用双引号,你原来的CMD ['mvn package']是错误的,应该写成CMD ["mvn", "package"](不过在这个场景里我们已经不需要这条指令了)。 - 如果Jar文件名会随版本变化,可以用通配符
ADD target/*.jar app.jar,避免硬编码版本号,但要保证target目录里只有一个Jar文件。
内容的提问来源于stack exchange,提问作者WildDev




