Maven执行go-offline后离线打包构建Docker镜像出现依赖缺失问题
问题根因
你遇到的报错是dependency:go-offline命令的默认行为缺陷导致的:
- Maven 3.8.2版本自带的
dependency:go-offline插件存在已知bug,不会完整拉取所有传递依赖的POM文件,也不会默认下载maven插件执行所需的依赖、所有scope的传递依赖(比如runtime scope、插件绑定的依赖) - 你当前的pom配置存在JDK版本不一致问题:properties中指定java.version为16,maven-compiler-plugin指定source/target为14,而基础镜像使用的是JDK15,版本不匹配会进一步加剧依赖拉取的异常
解决方案
方案1:调整go-offline命令参数(推荐,保留镜像分层缓存能力)
修改Dockerfile中依赖下载的RUN命令,追加参数拉取全量依赖:
# Build stage FROM maven:3.8.2-adoptopenjdk-15 AS Build COPY pom.xml /home/app # 追加参数拉取插件依赖、所有scope的传递依赖 RUN mvn -f /home/app/pom.xml dependency:go-offline --include-plugin-dependencies -DexcludeGroupIds=org.projectlombok COPY src /home/app/src RUN mvn -f /home/app/pom.xml -o clean package -DskipTests # Package stage FROM adoptopenjdk/openjdk15 COPY --from=Build /home/app/target/mango-0.0.1-SNAPSHOT.jar /usr/local/lib/mango.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/usr/local/lib/mango.jar"]
同时统一pom中的JDK版本配置,和镜像JDK版本对齐:
<properties> <java.version>15</java.version> </properties> <!-- 后续maven-compiler-plugin的source、target也同步改为15 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>15</source> <target>15</target> </configuration> </plugin>
方案2:跳过go-offline直接完成首次打包
如果不想调整参数,可以直接先执行一次联网打包跳过测试,再执行离线构建,保证所有依赖都已经被下载到本地缓存:
RUN mvn -f /home/app/pom.xml clean package -DskipTests \ && rm -rf /home/app/target RUN mvn -f /home/app/pom.xml -o clean package -DskipTests
方案3:更换Maven基础镜像版本
如果是Maven 3.8.2的版本bug导致的问题,可以直接更换为更高稳定版本的Maven基础镜像,比如maven:3.8.8-adoptopenjdk-15,规避版本自带的插件缺陷。
内容的提问来源于stack exchange,提问作者NAM
相关产品推荐
相关产品推荐

