首页 > 解决方案 > 为什么当我在特定模块上运行 mvn version:set 时另一个模块版本也会更新(它不应该)

问题描述

我想我刚刚发现了一个“mvn version:set”-bug。我有一个多模块 Maven 项目。所有模块都有相同的父级。我想独立设置模块的版本。因此,如果模块 A 更改而模块 B 未更改,则只有模块 A 可以获得新版本。但是当我尝试制作 1 个模块的快照版本时。它还更改了另一个模块的版本,尽管我使用“-f /module_A/pom.xml”参数来专门针对 module_A。

复制路径:我尝试单独制作所有模块的 SNAPSHOT 版本(在 POM.xml 中)。因此每个模块的版本都会将其版本增加 0.1 并在其后面添加“-SNAPSHOT”。

我发现以下命令正是这样做的,但是 1 个模块的行为很奇怪,并且当另一个模块的版本更新时它也会更新。

mvn -f ./module_X/pom.xml 版本:设置 -DnextSnapshot=true -DprocessParent=false -DprocessDependencies=false -Pjar

-我在根文件夹中运行命令。所有模块文件夹都位于此文件夹中。-module_X 应替换为模块文件夹名称(module_A、module_B、module_C 等) -"-DnextSnapshot=true" 将版本增加 0.1 并添加 "-SNAPSHOT" -"-DprocessParent=false 确保模块的父版本POM 未更改。-“DprocessDependencies=false”确保版本操作依赖项未更改。“-f /module_A/pom.xml”参数专门针对目标模块_A。

好的,现在它变得奇怪了:当我运行命令更新另一个模块时,其中一个模块的版本得到更新。

My set-up:

Parent-pom version = 1.3

module_A version = 0.5
module_A parent-version = 1.3

module_B version = 1.2
module_B parent-version = 1.1

module_C version = 1.2
module_C parent-version = 1.2

module_D version = 1.3
module_D parent-version = 1.2

Module_C 是一个奇怪的行为模块,如果我尝试更新任何其他模块,它的版本会更新到 1.3。

**似乎模块的版本已更新,因为它的父版本和版本相同,并且它们与父 POM 中的版本不同

Module_B 的父版本也与父 pom 不同,但此模块不会更新。(因为 1.2(它的版本)与 1.1(它的父版本)不同。

为了测试这个理论,我创建了一个新模块“module_E”,其版本设置为 1.1,父版本也设置为 1.1。更新任何其他模块的版本后,module_E als 的版本设置为 1.3!所以版本会更新到最新的父版本!

有谁知道我可以如何防止这种行为?这对我来说似乎不是理想的行为,对吧?

Parent-POM 最低限度:

<modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.9.RELEASE</version>
    <relativePath/>
</parent>

<groupId>com.project.service</groupId>
<artifactId>project-parent-pom</artifactId>
<version>1.3</version>
<packaging>pom</packaging>

<modules>
    <module>module_A</module>
    <module>module_B</module>
    <module>module_C</module>
    <module>module_D</module>
</modules>

module_C 最低限度:

<modelVersion>4.0.0</modelVersion>

<name>module_A</name>
<packaging>${packaging.type}</packaging>

<parent>
    <artifactId>project-parent-pom</artifactId>
    <groupId>com.project.service</groupId>
    <version>1.2</version>
    <relativePath>../pom.xml</relativePath>
</parent>

<artifactId>module_A</artifactId>
<version>1.2</version>

**模块的 POM 都是相同的,除了名称(module_A、module_B 等、版本和父版本)

表现奇怪的奇怪模块是父版本与版本相同的模块(如“模块最低限度”中所示,两者都设置为 1.2)。在这些情况下,版本设置为与父 POM 的版本相同的版本。我还使用父版本和版本设置为 1.5 的模块进行了测试。同样的事情发生了:版本从 1.5“更新”到了 1.3。

标签: javaspringmavenpom.xml

解决方案


我有一个多模块 Maven 项目。所有模块都有相同的父级。我想独立设置模块的版本。

鉴于问题中的模块定义,您还希望为每个孩子独立设置父版本。这与所有模块具有相同的 parent相矛盾。

为了实现模块中模块的独立版本,后者不应引用文件夹中的父POM 。..

模块的定义应如下所示:

<modelVersion>4.0.0</modelVersion>

<name>module_A</name>
<packaging>${packaging.type}</packaging>

<parent>
    <artifactId>project-parent-pom</artifactId>
    <groupId>com.project.service</groupId>
    <version>1.2</version>
    <relativePath/>
</parent>

<artifactId>module_A</artifactId>
<version>1.2</version>

请注意<relativePath/>in<parent>标签。在这种情况下,当为子模块构建有效的 POM 时,Maven 将始终从存储库中获取父定义。

当然,您甚至需要在尝试构建任何子模块之前发布和部署模块。

您可以查看Google 的 Auto project @ GitHub 以查看使用的类似结构。


推荐阅读