使用Dockerfile构建Java项目时依赖下载失败的问题
问题:Docker中Maven离线构建依赖缺失,本地执行正常
我有一个Maven管理的Java项目,本地执行./mvnw -B dependency:go-offline和./mvnw -o package -DskipTests完全正常,但在Docker镜像构建时执行相同命令,出现部分依赖下载失败的情况。
我的Dockerfile内容:
FROM eclipse-temurin:18.0.2.1_1-jdk-focal AS builder ENV APP=/home/meapi/app WORKDIR $APP COPY .mvn .mvn COPY mvnw pom.xml ./ RUN ./mvnw -B dependency:go-offline COPY src src RUN ./mvnw -o package -DskipTests FROM eclipse-temurin:18.0.2.1_1-jre-focal as dev RUN addgroup --system meapi && adduser --system --group meapi ENV spring_profiles_active=development ENV APP=/home/meapi/app WORKDIR $APP RUN chown -R meapi:meapi $APP USER meapi COPY --chown=meapi:meapi --from=builder $APP/target/*.jar $APP/app.jar EXPOSE 8080 ENTRYPOINT [ "java", "-jar", "/usr/meapi/app/app.jar" ]
构建时出现如下错误:
=> ERROR [builder 7/7] RUN ./mvnw -o package -DskipTests 12.9s ------ > [builder 7/7] RUN ./mvnw -o package -DskipTests: #14 7.221 [INFO] Scanning for projects... #14 8.659 [INFO] #14 8.659 [INFO] ---------------------< com.me:me-api >---------------------- #14 8.660 [INFO] Building me-api 0.0.1-SNAPSHOT #14 8.660 [INFO] --------------------------------[ jar ]--------------------------------- #14 10.43 [WARNING] The POM for javax.xml.bind:jaxb-api:jar:2.3.1 is missing, no dependency information available #14 11.03 [WARNING] The POM for com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.13.3 is missing, no dependency information available #14 11.11 [WARNING] The POM for net.minidev:json-smart:jar:2.4.8 is missing, no dependency information available #14 11.19 [WARNING] The POM for net.bytebuddy:byte-buddy:jar:1.12.10 is missing, no dependency information available #14 11.20 [WARNING] The POM for net.bytebuddy:byte-buddy-agent:jar:1.12.10 is missing, no dependency information available #14 11.35 [WARNING] The POM for org.glassfish.jaxb:jaxb-runtime:jar:2.3.6 is missing, no dependency information available #14 12.79 [INFO] ------------------------------------------------------------------------ #14 12.79 [INFO] BUILD FAILURE #14 12.79 [INFO] ------------------------------------------------------------------------ #14 12.82 [INFO] Total time: 5.758 s #14 12.83 [INFO] Finished at: 2022-09-13T19:58:59Z #14 12.83 [INFO] ------------------------------------------------------------------------ #14 12.85 [ERROR] Failed to execute goal on project me-api: Could not resolve dependencies for project com.me:me-api:jar:0.0.1-SNAPSHOT: The following artifacts could not be resolved: javax.xml.bind:jaxb-api:jar:2.3.1, com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.13.3, net.minidev:json-smart:jar:2.4.8, net.bytebuddy:byte-buddy:jar:1.12.10, net.bytebuddy:byte-buddy-agent:jar:1.12.10, org.glassfish.jaxb:jaxb-runtime:jar:2.3.6: Cannot access central (https://repo.maven.apache.org/maven2) in offline mode and the artifact javax.xml.bind:jaxb-api:jar:2.3.1 has not been downloaded from it before. -> [Help 1] #14 12.85 [ERROR] #14 12.85 [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. #14 12.85 [ERROR] Re-run Maven using the -X switch to enable full debug logging. #14 12.85 [ERROR] #14 12.85 [ERROR] For more information about the errors and possible solutions, please read the following articles: #14 12.85 [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException ------ executor failed running [/bin/sh -c ./mvnw -o package -DskipTests]: exit code: 1
使用的构建命令:docker build --no-cache --platform linux/amd64 --tag api --target dev .
解决方案
核心问题是dependency:go-offline并未下载所有构建阶段需要的依赖——它仅覆盖了编译、运行时的直接依赖,而打包过程中可能需要插件依赖、间接依赖,这些没被提前拉取。以下是几种可行的解决方法:
方法1:用compile目标替换dependency:go-offline
compile命令会触发所有编译相关的依赖下载,包括插件所需的依赖,能更全面地覆盖后续离线打包的需求。修改builder阶段的命令:
FROM eclipse-temurin:18.0.2.1_1-jdk-focal AS builder ENV APP=/home/meapi/app WORKDIR $APP COPY .mvn .mvn COPY mvnw pom.xml ./ RUN ./mvnw -B compile -DskipTests # 替换原有的dependency:go-offline COPY src src RUN ./mvnw -o package -DskipTests
方法2:扩展dependency:go-offline的参数
添加dependency:resolve-plugins来下载插件依赖,同时确保覆盖所有profile的依赖:
RUN ./mvnw -B dependency:go-offline dependency:resolve-plugins -DskipTests
方法3:先执行一次完整的在线打包
如果上述方法仍不生效,可以先在线执行一次完整打包,确保所有依赖都被下载到镜像内的Maven仓库,再执行离线打包:
RUN ./mvnw -B package -DskipTests COPY src src RUN ./mvnw -o package -DskipTests
额外检查
确认Docker daemon能正常访问Maven中央仓库,没有被代理、防火墙限制——毕竟第一次下载依赖需要网络连接。
内容的提问来源于stack exchange,提问作者João Casarin
相关产品推荐
相关产品推荐

