You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker Cloud自动化构建Maven项目报错:找不到Jar文件如何解决?

解决Docker构建Maven项目时Jar文件找不到的问题

你的问题核心是Dockerfile的写法存在几个关键错误,导致构建过程中要么没生成Jar文件,要么无法访问到它,我帮你拆解问题并给出修复方案:

问题根源

  1. 重复的FROM指令:你写了两个FROM,Docker会直接以第二个maven:3.5.2-jdk-8-slim作为基础镜像,完全忽略第一个,这不是正确的多阶段构建用法。
  2. CMD ['mvn package']不生效CMD是容器启动时才会执行的命令,镜像构建阶段根本不会运行这条指令,所以target目录和Jar文件自然不会生成。
  3. ADD的文件不在构建上下文ADD是从你运行docker build的本地目录(构建上下文)复制文件,如果本地没提前执行mvn package生成Jar,或者构建上下文里没有target文件夹,Docker肯定找不到这个文件。

修复方案

给你两种实用的修复方式,按需选择:

方案1:本地先构建Jar,再打包镜像(适合本地有Maven环境)

  1. 先在项目根目录执行:
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" ]
  1. 在项目根目录运行构建命令:
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格式的指令(比如CMDENTRYPOINT)需要用双引号,你原来的CMD ['mvn package']是错误的,应该写成CMD ["mvn", "package"](不过在这个场景里我们已经不需要这条指令了)。
  • 如果Jar文件名会随版本变化,可以用通配符ADD target/*.jar app.jar,避免硬编码版本号,但要保证target目录里只有一个Jar文件。

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

火山引擎 最新活动