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

Posted

技术标签:

【中文标题】在多模块 Maven 项目中更新模块的版本号【英文标题】:Updating version numbers of modules in a multi-module Maven project 【发布时间】:2011-08-09 05:41:32 【问题描述】:

我有一个多模块 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>

【问题讨论】:

您的问题被错误陈述,并使拥有真正多模块(“聚合”)POM 的人感到困惑。从您的示例和答案看来,您实际上是在谈论父 POM,而不是多模块聚合 POM。见maven.apache.org/pom.html#Aggregation。 【参考方案1】:

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


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

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

【讨论】:

mvn version:set 不影响模块。 确实如此,我使用它。 Sets the current project's version and based on that change propagates that change onto any child modules as necessary. 好的,当反应堆构建在同一时间父级时。当结构看起来不一样时会令人困惑...... mvn release:update-versions -DautoVersionSubmodules 对我来说工作得很好,即使我没有发布 :-)【参考方案2】:

使用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。

【讨论】:

如果有一个不需要您实际更改每个模块的解决方案,那就太好了。我能想到的唯一选择是始终为父 pom 使用快照版本。 除了versions:set,还可以指定-DgenerateBackupPoms=false,因为这个插件默认备份原始pom文件。 这就是 versions:commit 的重点:“删除 pom 的初始备份,从而接受更改。” 一个新插件以不同的方式解决了这个问题中描述的问题:mojo.codehaus.org/flatten-maven-plugin/examples/… @MichaelLaffargue mvn versions:commit 好像删除了之前pom.xml生成的备份文件【参考方案3】:

我鼓励您阅读 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。

【讨论】:

具体寻找什么? +1 用于为pom.xml 文件提供正确的格式,但我同意(与@ThorbjørnRavnAndersen 一起)阅读整本书来获取这些信息是多余的。 :p 不幸的是,从父级继承版本信息并不能消除必须在项目中修改 所有 pom 文件的负担 - 因为它们都通过 version 引用父级 号码。 你可以使用versions-maven-plugin来处理所有这些东西,或者你可以使用maven-release-plugin,所以你不需要手动处理...... 我仍然感到难以置信的是,人们仍然只是将链接放在这里,而不考虑链接是否会过期。这使得这个答案基本上没有用。【参考方案4】:

versions:update-child-modules 听起来像您要找的东西。您可以执行versions:set,但这是一种更新父版本号的轻量级方法。对于子模块,我认为您应该删除 &lt;version&gt; 定义,因为它们将继承父模块的版本号。

【讨论】:

让子模块继承父版本是一种好方法吗?如果只有子模块发生变化怎么办? 这假定根模块是父模块,但不一定是这种情况。【参考方案5】:

最好的方法是,因为你打算将你的模块捆绑在一起,你可以在最外面的pom.xml(父模块)直接在&lt;project&gt;标签下指定&lt;dependencyManagement&gt;标签。它控制版本和组名。在您的个人模块中,您只需在您的pom.xml 中指定&lt;artifactId&gt; 标记。它将从父文件中获取版本。

【讨论】:

我在pom.xml 上找不到标签dependencyManagement。你在考虑something else吗?【参考方案6】:

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

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

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

经过大量阅读和实验,事实证明有一种方法可以使用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

【讨论】:

我们如何像 build-helper 插件一样自动化下一个版本? 使用 Maven 3.5.0 我无法让它工作。我有项目聚合,只有父 pom 得到了更新。我还尝试了项目继承(连同聚合 - 来自提供的链接的“所有三个规则”),再次只有父 pom 得到更新。 找到了make-it-work的秘密开关:父pom的起始版本和模块必须相同!我的父 pom 以“1-SNAPSHOT”开头,模块有“1.0.0-SNAPSHOT”。 :) 对于聚合器项目,聚合器的版本和子模块的版本不必相同。 (例如,您的聚合器 pom 可能很少更改并且可以保持在特定版本,而各个子模块可以有自己的发布周期)。指定给versions:set 插件的关键属性是-DoldVersion='*',在mojohaus.org/versions-maven-plugin/set-mojo.html 上明确表示在处理聚合器项目时应指定此属性。 -DprocessAllModules 在什么条件下真正起作用?它对我不起作用。【参考方案7】:

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

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

【讨论】:

谢谢,@Crummy,你拯救了我的一天 mojohaus.org/build-helper-maven-plugin/parse-version-mojo.html 或者你可以使用-DoldVersion='*' 酷,谢谢!! SNAPSHOT 示例:mvn build-helper:parse-version versions:set -DnewVersion=\$parsedVersion.majorVersion.\$parsedVersion.minorVersion.\$parsedVersion.nextIncrementalVersion-SNAPSHOT versions:commit【参考方案8】:

最简单的方法是将每个 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】:

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

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

【讨论】:

【参考方案10】:

上面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>
+        

【讨论】:

【参考方案11】:

我在找这个:

<properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
</properties>

【讨论】:

以上是关于在多模块 Maven 项目中更新模块的版本号的主要内容,如果未能解决你的问题,请参考以下文章

在多模块 Maven 项目中构建所有模块后,如何运行集成测试?

在多模块 maven 项目中的模块之间共享 src/test 类

使用 Spring 在多模块 Maven 项目中进行集成测试

在多模块 Maven 项目中运行 exec-maven-plugin 时出现问题

maven ::在多模块项目中仅运行单个测试

在多模块 Java/scala 项目中有一个通用的 webapp?