Docker构建无法找到内部Maven依赖的解决方案咨询
问题描述
本人是Docker新手,正在构建微服务应用,项目依赖IntelliJ中另一个本地模块com.annerd:ams-commons-utilities:1.2.0,POM配置如下:
<!-- Annerd Dependencies --> <dependency> <groupId>com.annerd</groupId> <artifactId>ams-commons-utilities</artifactId> <version>1.2.0</version> <scope>compile</scope> </dependency>
本地IntelliJ中可正常构建,但执行Dockerfile构建时出现依赖无法解析错误:
50.53 [ERROR] Failed to execute goal on project ams-findme: Could not resolve dependencies for project com.annerd.findme:ams-findme:jar:BETA-2.1: The following artifacts could not be resolved: com.annerd:ams-commons-utilities:jar:1.2.0 (absent): Could not find artifact com.annerd:ams-commons-utilities:jar:1.2.0 in central (https://repo.maven.apache.org/maven2) -> [Help 1]
当前使用的Dockerfile内容:
FROM maven:3.9.6-amazoncorretto-17-al2023 AS build-stage RUN mkdir -p /usr/src/app WORKDIR /usr/src/app ADD . /usr/src/app RUN mvn install -U ############################################################### FROM openjdk:17-alpine AS production-stage COPY --from=build-stage /usr/src/app/target/*.jar annerd-find-me-api.jar EXPOSE 8785 ENTRYPOINT ["java", "-jar", "annerd-find-me-api.jar", "-Xmx256m -Xms128m -Dspring.profiles.active=prod"]
目前暂无私有仓库(计划后续搭建),求无需私有仓库的解决办法,是否遗漏了步骤?
无需私有仓库的解决办法
方案1:在Docker构建流程中先构建并安装本地依赖模块
如果你的项目是多模块Maven项目(根目录有包含所有模块的父pom.xml),只需调整Dockerfile的构建逻辑,先安装依赖模块再构建主项目:
修改后的Dockerfile示例:
FROM maven:3.9.6-amazoncorretto-17-al2023 AS build-stage WORKDIR /usr/src/app # 复制整个多项目根目录(包含ams-commons-utilities和ams-findme模块) COPY . . # 先安装commons模块到容器的Maven本地仓库 RUN mvn -f ams-commons-utilities/pom.xml clean install # 再构建主项目 RUN mvn -f ams-findme/pom.xml clean package -DskipTests ############################################################### FROM openjdk:17-alpine AS production-stage # 复制主项目的jar包 COPY --from=build-stage /usr/src/app/ams-findme/target/*.jar annerd-find-me-api.jar EXPOSE 8785 ENTRYPOINT ["java", "-Xmx256m", "-Xms128m", "-Dspring.profiles.active=prod", "-jar", "annerd-find-me-api.jar"] # 注意:原ENTRYPOINT的参数格式有误,JVM参数应放在java命令后、-jar前
说明:
- 确保执行
docker build时的上下文是多模块项目的根目录 - 该方案符合Maven规范,不依赖本地环境,适合长期使用
方案2:复用本地Maven仓库的依赖缓存
将本地已安装好的依赖(包括ams-commons-utilities)复制到Docker容器中,让Maven离线构建:
修改后的Dockerfile示例:
FROM maven:3.9.6-amazoncorretto-17-al2023 AS build-stage WORKDIR /usr/src/app # 复制本地Maven仓库到容器,避免重新下载依赖 COPY ~/.m2/repository /root/.m2/repository # 复制当前项目代码 COPY . . # 离线模式构建(-o表示offline) RUN mvn install -U -o ############################################################### FROM openjdk:17-alpine AS production-stage COPY --from=build-stage /usr/src/app/target/*.jar annerd-find-me-api.jar EXPOSE 8785 ENTRYPOINT ["java", "-Xmx256m", "-Xms128m", "-Dspring.profiles.active=prod", "-jar", "annerd-find-me-api.jar"]
说明:
- 若
~/.m2/repository不在Docker构建上下文范围内,需先将本地Maven仓库复制到项目目录,或使用docker build --build-arg传递路径调整COPY命令 - 该方案适合快速临时解决,但依赖本地环境的Maven仓库状态,不适合团队协作场景
方案3:将依赖模块打包为本地jar并引入
手动将ams-commons-utilities模块打包成jar,放到主项目的本地lib目录,再通过POM配置引用:
- 本地执行
cd ams-commons-utilities && mvn clean package,得到target/ams-commons-utilities-1.2.0.jar - 在主项目
ams-findme中创建src/main/resources/lib目录,将上述jar复制进去 - 修改主项目POM的依赖配置:
<dependency> <groupId>com.annerd</groupId> <artifactId>ams-commons-utilities</artifactId> <version>1.2.0</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/ams-commons-utilities-1.2.0.jar</systemPath> </dependency>
- 原Dockerfile无需修改,构建时Maven会直接读取本地lib中的jar
说明:
- 该方案操作简单,但灵活性不足,依赖模块更新时需手动同步jar文件,适合小型项目或临时场景
内容的提问来源于stack exchange,提问作者Alfredo Marin
相关产品推荐
相关产品推荐

