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

时间:2011-04-20 06:21:46

标签: 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>

11 个答案:

答案 0 :(得分:522)

使用versions:set中的versions-maven plugin

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

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

如果你犯了错误,请执行

mvn versions:revert

之后,或

mvn versions:commit

如果您对结果感到满意。


注意:此解决方案假定所有模块也使用聚合pom作为父pom,这个场景在此答案时被视为标准。如果不是这种情况,请转到Garret Wilson's answer

答案 1 :(得分:33)

给定的答案假设有问题的项目除了模块聚合外还使用项目继承。事实上,这些是不同的概念:

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

某些项目可能是模块的聚合,但在聚合器POM和聚合模块之间没有父子关系。 (可能根本没有父子关系,或者子模块可能使用单独的POM作为&#34;父母&#34 ;.)在这些情况下,给定的答案将不起作用。

经过大量阅读和实验,结果证明有一种方法可以使用Versions Maven Plugin不仅更新聚合器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

答案 2 :(得分:21)

您可能需要查看Maven发布插件的release:update-versions目标。它将更新父版本及其下的所有模块。


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

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

答案 3 :(得分:11)

我鼓励您阅读Maven Book about multi-module(reactor)版本。

我特别指的是以下内容:

<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>

is a better link

答案 4 :(得分:6)

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

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

答案 5 :(得分:4)

versions:update-child-modules听起来就像你在寻找什么。你可以做版本:如上所述设置,但这是一种轻量级的方式来更新父版本号。对于子模块,我认为您应该删除<version>定义,因为它们将继承父模块的版本号。

答案 6 :(得分:2)

最好的方法是,由于您打算将模块捆绑在一起,因此您可以在<dependencyManagement>标记下的最外侧pom.xml(父模块)中指定<project>标记。它控制版本和组名称。在您的单个模块中,您只需在<artifactId>中指定pom.xml标记即可。它将采用父文件的版本。

答案 7 :(得分:1)

worked for us上面给出的解决方案也很长时间了:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

但是它昨天停止工作了,由于a recent bug in a the versions-maven-plugin

,我们发现了它

我们的workaround was to change the parent/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>
+        

答案 8 :(得分:0)

最简单的方法是将每个pom.xml中的版本更改为任意版本。然后检查依赖性管理以使用此模块中使用的模块的正确版本!例如,如果您要增加拖曳模块项目的版本控制,则必须像下面这样:

在子模块中:

    <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>

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

我一直在寻找这个:

atoms.loc[atoms.element != 'H']