GitLab Runner构建Maven项目无法从GitLab Registry找到父POM
故障根因
- Maven解析父POM的时机早于加载当前项目POM内
<repositories>配置的时机,也就是说你写在项目pom.xml里的GitLab私有仓库地址,在拉父POM的阶段根本不会生效。Maven拉父POM时只会读取settings.xml里配置的仓库、本地已缓存的依赖、默认中央仓库,这是Maven本身的执行逻辑问题,和Runner环境无关。 - 本地构建能跑通,完全依赖你本地
~/.m2/settings.xml里配置的GitLab Maven仓库地址和访问凭证。GitLab Runner执行任务时用的是隔离的全新环境,默认没有这份Maven配置,既找不到私有仓库地址,也没有访问GitLab包仓库的权限,自然拉不到存放在私有仓库里的父POM。 - 你pom里写的
<distributionManagement>节点只负责mvn deploy时的包上传逻辑,完全不参与依赖、父POM的拉取流程,配了也解决不了下载问题。
修复方案
方案1:CI流程内动态生成Maven配置(推荐)
不需要修改Runner服务器的全局配置,直接在项目的.gitlab-ci.yml里,执行构建命令前动态生成带认证的settings.xml,用GitLab CI内置的CI_JOB_TOKEN做鉴权,没有硬编码凭证的风险:
maven_build: image: maven:3.8.6-jdk-11 # 换成你项目实际用的Maven和JDK版本 script: # 生成Maven配置文件 - mkdir -p ~/.m2 - | cat > ~/.m2/settings.xml <<'EOF' <settings> <servers> <server> <id>gitlab-maven</id> <configuration> <httpHeaders> <property> <name>Job-Token</name> <value>${env.CI_JOB_TOKEN}</value> </property> </httpHeaders> </configuration> </server> </servers> <profiles> <profile> <id>gitlab-maven-profile</id> <repositories> <repository> <id>gitlab-maven</id> <url>https://my.gitlab.instance.com/api/v4/groups/11/-/packages/maven</url> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository> </repositories> </profile> </profiles> <activeProfiles> <activeProfile>gitlab-maven-profile</activeProfile> </activeProfiles> </settings> EOF # 执行构建,注意你之前写的./mwn属于笔误,Maven Wrapper的执行命令是./mvnw - ./mvnw clean install -B
这种方式配置跟随代码仓库管理,不管是共享Runner还是专属Runner都能正常执行,不需要额外运维操作。
方案2:Runner全局配置Maven settings
如果你的Runner是固定私有部署、承接多个项目的构建任务,可以直接登录Runner宿主机,切换到Runner运行的用户(默认部署的话是gitlab-runner用户),在用户家目录下创建.m2/settings.xml,内容和上面的配置一致,鉴权部分可以换成GitLab生成的长期部署令牌,避免Job Token的权限范围限制。配置完成后所有跑在这台Runner上的Maven任务都能直接访问GitLab包仓库。
补充检查项
如果配置完还是拉不到,去父POM所在的GitLab项目页,进入「设置 > 软件包与注册表 > 软件包注册表」,确认包的访问权限已经开放给当前项目所在的群组,允许CI任务拉取。
内容的提问来源于stack exchange,提问作者Spark Monkay
相关产品推荐
相关产品推荐

