You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置引用:

  1. 本地执行cd ams-commons-utilities && mvn clean package,得到target/ams-commons-utilities-1.2.0.jar
  2. 在主项目ams-findme中创建src/main/resources/lib目录,将上述jar复制进去
  3. 修改主项目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>
  1. 原Dockerfile无需修改,构建时Maven会直接读取本地lib中的jar

说明:

  • 该方案操作简单,但灵活性不足,依赖模块更新时需手动同步jar文件,适合小型项目或临时场景

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:03:12