在多模块 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,但这是一种更新父版本号的轻量级方法。对于子模块,我认为您应该删除 <version>
定义,因为它们将继承父模块的版本号。
【讨论】:
让子模块继承父版本是一种好方法吗?如果只有子模块发生变化怎么办? 这假定根模块是父模块,但不一定是这种情况。【参考方案5】:最好的方法是,因为你打算将你的模块捆绑在一起,你可以在最外面的pom.xml
(父模块)直接在<project>
标签下指定<dependencyManagement>
标签。它控制版本和组名。在您的个人模块中,您只需在您的pom.xml
中指定<artifactId>
标记。它将从父文件中获取版本。
【讨论】:
我在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 项目中进行集成测试