更新多模块Maven项目中模块的版本号

我有一个多模块的maven项目。我们打算把所有这些模块放在一起。但到目前为止,我在每个模块pom.xml中完成了如下所示的硬编码版本

<parent>
<artifactId>xyz-application</artifactId>
<groupId>com.xyz</groupId>
<version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

主父模块具有下面的配置

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>
376216 次浏览

你可能想看看Maven发布插件的发布:update-versions目标。它将更新父版本以及它下面的所有模块。


更新:请注意以上是发布插件。如果你没有释放,你可能想要使用versions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

使用versions-maven插件中的versions:set:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

它将调整多模块项目中的所有pom版本、父版本和依赖版本。

如果你犯了错误,那就去做

mvn versions:revert

之后,或

mvn versions:commit

如果你对结果满意的话。


注意:这个解决方案假设所有模块都使用聚合pom作为父pom,在回答这个问题时,这个场景被认为是标准的。如果不是这样,那么就使用加勒特·威尔逊的回答

我鼓励你阅读关于多模块的Maven书(反应堆)构建。

我特别指的是以下几点:

<parent>
<artifactId>xyz-application</artifactId>
<groupId>com.xyz</groupId>
<version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

应该改为。这里只关心父部分中未定义的版本,它已定义。

<modelVersion>4.0.0</modelVersion>


<parent>
<artifactId>xyz-application</artifactId>
<groupId>com.xyz</groupId>
<version>2.50.0.g</version>
</parent>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>

是一个更好的链接

versions:update-child-modules听起来像你正在寻找的。您可以像前面提到的那样执行versions:set,但这是更新父版本号的一种轻量级方式。对于子模块,我认为应该删除<version>定义,因为它们将继承父模块的版本号。

最好的方法是,既然你打算将你的模块捆绑在一起,你可以在最外层的pom.xml(父模块)中直接在<project>标记下指定<dependencyManagement>标记。它控制版本和组名。在你的单独模块中,你只需要在你的pom.xml中指定<artifactId>标记。它将从父文件中获取版本。

给出的答案假设所讨论的项目除了模块聚合之外还使用了项目继承。事实上,这是两个截然不同的概念:

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance_vs_Project_Aggregation

有些项目可能是模块的聚合,但聚合器POM和聚合模块之间没有父子关系。(可能根本没有父子关系,或者子模块可能完全使用一个单独的POM作为“父”。)在这些情况下,给出的答案是行不通的。

经过大量阅读和实验,发现有一种方法可以使用Maven插件不仅更新聚合器POM,而且更新所有聚合模块;它是processAllModules选项。必须在聚合器项目的目录下执行以下命令:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules

版本Maven插件不仅会更新所有包含模块的版本,还会更新模块间的依赖关系!!!!这是一个巨大的胜利,将节省大量的时间,防止各种各样的问题。

当然,不要忘记在所有模块中提交更改,你也可以使用相同的开关:

mvn versions:commit -DprocessAllModules

您可以决定完全放弃备份POMS,并在一个命令中完成所有工作:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false

如果你想完全自动化这个过程(即你想增加版本号,而不需要知道当前版本号是什么),你可以这样做:

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit

最简单的方法是将每个pom.xml中的版本更改为任意版本。然后检查依赖管理是否使用了这个模块中使用的正确版本的模块!例如,如果你想增加一个tow模块项目的版本控制,你必须像这样做:

在公子模块中:

    <parent>
<artifactId>A-application</artifactId>
<groupId>com.A</groupId>
<version>new-version</version>
</parent>

在父模块中:

<groupId>com.A</groupId>
<artifactId>A-application</artifactId>
<version>new-version</version>

更新子模块上的主pom.xml和父版本:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false

上面给出的解决方案为我们工作也是很长一段时间:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

然而,它昨天停止工作,我们发现它是由于version -maven插件最近的一个bug

我们的(临时)解决方法是更改父/pom.xml文件如下:

--- jackrabbit/oak/trunk/oak-parent/pom.xml 2020/08/13 13:43:11 1880829
+++ jackrabbit/oak/trunk/oak-parent/pom.xml 2020/08/13 15:17:59 1880830
@@ -329,6 +329,13 @@
<artifactId>spotbugs-maven-plugin</artifactId>
<version>3.1.11</version>
</plugin>
+
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>versions-maven-plugin</artifactId>
+          <version>2.7</version>
+        </plugin>
+

我在找这个:

<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
< p >提示:
如果您的多模块maven项目使用项目版本作为您的主POM文件中的属性,例如

<properties>
<revision>1.0.0</revision> <!-- project version/revision -->
...
</properties>

在这种情况下,你可以通过使用set-property而不是set来改变你的项目版本:

例子:

mvn versions:set-property -Dproperty=revision -DnewVersion="2.0.0"


mvn versions:commit