Java Docker容器非根目录放置Jar无法运行问题求助
问题根源
你在构建阶段犯了一个路径复制的错误:
- 当构建阶段设置
WORKDIR /app后,你执行COPY /src /src,这会把宿主机构建上下文里的src目录复制到容器内的根目录下的/src,而不是/app/src。 - Maven在
/app目录下执行mvn clean package时,找不到预期的src目录(Maven默认项目结构要求源码在当前工作目录下),所以打包出来的app.jar实际上是不包含编译后类文件的无效jar,自然会在运行时抛出ClassNotFoundException。 - 第二个Dockerfile因为没设置WORKDIR,默认在容器根目录执行,
COPY /src /src刚好把源码放到了Maven预期的位置,所以打包正常。
修复方案
修改构建阶段的COPY命令,确保源码被复制到/app/src目录下:
# === Build stage === FROM maven:3.9.9-eclipse-temurin-21-alpine AS builder WORKDIR /app # 把宿主机的src复制到当前工作目录(/app)下的src COPY pom.xml ./ COPY src/ src/ RUN mvn clean package -DskipTests # === Run stage === FROM eclipse-temurin:21.0.5_11-jre-alpine-3.21 WORKDIR /app COPY --from=builder /app/target/*.jar ./app.jar EXPOSE 9090 CMD ["java", "-jar", "app.jar"]
核心是把COPY /src /src改成COPY src/ src/(或COPY ./src ./src),让源码放到构建阶段工作目录/app下的src子目录,符合Maven默认项目结构,打包出的jar才会包含正确的类文件。
内容的提问来源于stack exchange,提问作者Auwate
相关产品推荐
相关产品推荐

