V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Emilyan
V2EX  ›  Java

用 Gitlab CI/CD 在 gitlab 私服仓库发布 maven 包,为什么子项目 pom 文件里的<repositories>属性没有继承父项目

  •  
  •   Emilyan · 283 天前 · 913 次点击
    这是一个创建于 283 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个父项目 XX-parent, 子项目 xx-commonlib 要用流水线发布到公司的 gitlab 私服,script 命令 mvn deploy -s ci_settings.xml

    父项目的 pom 中添加了仓库和部署仓库的地址

    <repositories>
        <repository>
            <id>gitlab-maven</id>
            <url>https://sample-gitlab/api/v4/projects/20/packages/maven</url>
        </repository>
    </repositories>
    <distributionManagement>
        <repository>
            <id>gitlab-maven</id>
            <url>https://sample-gitlab/api/v4/projects/20/packages/maven</url>
        </repository>
        <snapshotRepository>
            <id>gitlab-maven</id>
            <url>https://sample-gitlab/api/v4/projects/20/packages/maven</url>
        </snapshotRepository>
    </distributionManagement>
    

    子项目 xx-commonlib 的 pom 中继承父项目,没有添加相关仓库的配置

    <parent> <groupId>xx.xx.xx</groupId> <artifactId>xx-parent</artifactId> <version>1.0.0-SNAPSHOT</version> <relativePath/> </parent>

    向 gitlab 推送代码,CI/CD 自动发布后,父项目 xx-parent 可以正常发布到 gitlab 的 maven 私服仓库上,子项目 xx-commonlib 报错

    Non-resolvable parent POM for xx.xx.xx:xx-commonlib:1.0.0-SNAPSHOT: Could not find artifact xx.xx.xx:xx-parent:pom:1.0.0-SNAPSHOT and 'parent.relativePath' points at no local POM @ line 6, column 13

    必须在子项目 xx-commonlib 的 pom 中添加

    <repositories> <repository> <id>gitlab-maven</id> <url>https://sample-gitlab/api/v4/projects/20/packages/maven</url> </repository> </repositories>

    后子项目才可以正常发布到仓库。

    我的疑问是为什么子项目没有继承父项目的<repositories>仓库配置,但是可以继承<distributionManagement>部署仓库配置。 因为这个父项目下面有不少子项目,如果每个子项目的 pom 文件里都要写一遍 repositories 地址的话可能比较麻烦。

    stackflow 上有个类似的问题,好像没有正确的答案 https://stackoverflow.com/questions/69570730/maven-child-modules-not-inheriting-repository-tags

    9 条回复    2023-07-31 10:03:45 +08:00
    vantis
        1
    vantis  
       283 天前
    子项目的 parent.relativePath 配对了吗 这个报错应该是没找到父项目 自然无从继承
    所以首先要通过相对路径找到本地的父项目 才能继承父项目的配置
    Emilyan
        2
    Emilyan  
    OP
       282 天前
    @vantis
    就是<relativePath/>
    强制从仓库里寻找父项目
    vantis
        3
    vantis  
       282 天前
    @Emilyan #2 不设置 relativePath 子项目就强制去仓库里找项目——这时的仓库是谁呢?因为本配置没有 父级又找不到 自然是用你机器上的 settings 配置了
    所以应该指定 relativePath 为../pom.xml 让子项目先根据相对路径去找到父级 就能继承父级的配置了 repositories, distributionManagement 等等配置也会继承到
    vantis
        4
    vantis  
       282 天前
    可以参考
    https://www.baeldung.com/maven-relativepath
    baeldung 的文章质量不错的
    Emilyan
        5
    Emilyan  
    OP
       281 天前
    @vantis 谢谢热心回复,测试了一下还是'parent.relativePath' points at no local POM 错误。
    这是把 maven 包 deploy 到 Gitlab-CI 发布到公司私服,不是我机器上。而且在设置<relativePath>为空的情况下,
    <distributionManagement>是成功继承的,就是继承不了<repositories>配置
    vantis
        6
    vantis  
       280 天前
    @Emilyan #5 子项目不是随父项目一起打包的吗?如果是通过父项目下执行 mvn deploy 没有特殊配置的话 父子项目都会 deploy 的
    我是不是可以理解你拆成两个项目了?
    Emilyan
        7
    Emilyan  
    OP
       278 天前
    @vantis 确实是拆成两个项目,路径上是平级的。父项目只是做依赖管理。
    ikas
        8
    ikas  
       273 天前
    你是在子项目运行 mvn 命令的吧...
    Emilyan
        9
    Emilyan  
    OP
       271 天前
    @ikas 是的,但是父项目已经发布到 gitlab package registry 仓库了啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   877 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:55 · PVG 05:55 · LAX 14:55 · JFK 17:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.