gpt4 book ai didi

maven - 如果 child 的 pom 版本与 parent 的聚合器 pom 及其子模块的版本不同,请避免错误的版本插值

转载 作者:行者123 更新时间:2023-12-05 00:18:01 24 4
gpt4 key购买 nike

问题描述

我们有一个 Maven 聚合器 pom,其中一些子 pom(模块)都具有相同的版本:

pom.xml (parent zoo, version 2.0.0)
|-- pom.xml (child module cat, version 2.0.0)
|-- pom.xml (child module dog, version 2.0.0)
|-- ...

在依赖项管理部分中,所有子项都使用项目版本声明,以简化依赖项的声明。
父 pom 看起来像
<groupId>com.acme</groupId>
<artifactId>zoo</artifactId>
<version>2.0.0</version>
<packaging>pom</packaging>

<modules>
<module>cat</module>
<module>dog</module>
</modules>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>cat</artifactId>
<version>${project.version}</version>
</dependency>
<!-- other child modules go here -->
</dependencies>
</dependencyManagement>

子 pom 定义为
<parent>
<groupId>com.acme</groupId>
<artifactId>zoo</artifactId>
<version>2.0.0</version>
</parent>

<groupId>com.acme</groupId>
<artifactId>cat</artifactId>

<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>dog</artifactId>
</dependency>
</dependencies>

还有另一个 pom 也将父 pom 声明为其父级(继承),但未在此父级中列为子模块(无聚合)。这个 pom 有不同的版本。
<parent>
<groupId>com.acme</groupId>
<artifactId>zoo</artifactId>
<version>2.0.0</version>
</parent>

<groupId>com.acme</groupId>
<artifactId>boo</artifactId>
<version>1.0.0</version>

<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>dog</artifactId>
</dependency>
</dependencies>

实际上我们已经预料到依赖的版本 com.acme.dog从父 pom 的依赖管理部分中提取 com.acme.zoo等于 2.0.0 .然而 Maven documentation on project interpolation and variables

One factor to note is that these variables are processed after inheritance as outlined above. This means that if a parent project uses a variable, then its definition in the child, not the parent, will be the one eventually used.



即:在 react 堆中构建变量 ${project.version}用于父 pom 的依赖管理部分 com.acme.zoocom.acme.bar 进行评估等于 1.0.0什么不符合预期。

备注

在父 pom 中使用变量有一种解决方法,该变量必须与父 pom 版本保持同步。但是,此解决方案与 Maven Release Plugin 不兼容。 .

问题

我们如何才能实现期望的行为
  • 具有相同版本的 child 的聚合器 pom
  • 在依赖项管理部分声明子项以确保所有依赖项具有相同的版本
  • 与不同版本一起使用继承
  • maven-release-plugin 的兼容性

  • 没有项目插值变量的陷阱?

    最佳答案

    maven 发布插件能够更改父 pom 中管理的依赖项的版本。

    因此,如果您像这样定义您的 Maven 父级:

    <groupId>com.acme</groupId>
    <artifactId>zoo</artifactId>
    <version>2.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
    <module>cat</module>
    <module>dog</module>
    </modules>

    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>com.acme</groupId>
    <artifactId>cat</artifactId>
    <version>2.0.0-SNAPSHOT</version>
    </dependency>
    <!-- other child modules go here -->
    </dependencies>
    </dependencyManagement>

    如您所见,父级和托管依赖项的版本是相同的。我将它们设置为 SNAPSHOT 版本,因为发布插件将在发布时创建最终版本:执行

    您的 child 绒球可以保持原样。

    因为在您的设置中,您的父项目也是您可以调用的 react 器
    mvn release:perform -DautoVersionSubmodules=true

    当您运行此命令时,它将更新所有子模块中的父版本。该选项与您运行时基本相同
    mvn versions:update-child-modules

    这意味着它会改变 child 的poms。

    运行 mvn release:perform 命令后,您的父 pom 将如下所示:
    <groupId>com.acme</groupId>
    <artifactId>zoo</artifactId>
    <version>2.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
    <module>cat</module>
    <module>dog</module>
    </modules>

    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>com.acme</groupId>
    <artifactId>cat</artifactId>
    <version>2.0.1-SNAPSHOT</version>
    </dependency>
    <!-- other child modules go here -->
    </dependencies>
    </dependencyManagement>

    你的 child 像这样
    <parent>
    <groupId>com.acme</groupId>
    <artifactId>zoo</artifactId>
    <version>2.0.1-SNAPSHOT</version>
    </parent>

    <groupId>com.acme</groupId>
    <artifactId>cat</artifactId>

    <dependencies>
    <dependency>
    <groupId>com.acme</groupId>
    <artifactId>dog</artifactId>
    </dependency>
    </dependencies>

    最终版本将仅存在于 release:prepare 命令创建的标签中。

    PS:当运行 release:prepare 命令后提示时,您可以为最终版本和下一个开发版本定义其他版本。

    关于maven - 如果 child 的 pom 版本与 parent 的聚合器 pom 及其子模块的版本不同,请避免错误的版本插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38889023/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com