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


324

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

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

Answers:


630

使用versions:set版本-maven插件

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

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

如果您输入有误,请执行

mvn versions:revert

之后,或

mvn versions:commit

如果您对结果感到满意。


注意:此解决方案假定所有模块也将聚合pom用作父pom,在此答案被认为是标准的情况下。如果不是这种情况,请寻求Garret Wilson的回答


5
如果有不需要您实际更改每个模块的解决方案,那将是很好的。我能想到的唯一替代方法是始终为父pom使用快照版本。
AmanicA 2011年

54
除了versions:set可以指定外-DgenerateBackupPoms=false,默认情况下,此插件还备份原始pom文件。
Maksim Sorokin

20
这就是重点versions:commit:“删除pom的初始备份,从而接受更改。”
Michael Laffargue

2
一个新的插件以不同的方式解决了该问题中描述的问题:mojo.codehaus.org/flatten-maven-plugin/examples/…–
Stephan

1
@MichaelLaffargue mvn版本:commit似乎删除了先前pom.xml生成的备份文件
Cris Rockwell

58

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

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

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

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

我们如何像build-helper插件一样自动化下一个版本?
lostintranslation

使用Maven 3.5.0,我无法使它正常工作。我有项目汇总,只有父pom得到更新。我还尝试了项目继承(以及聚合-提供的链接中的“所有三个规则”),并且再次仅更新了父pom。
斯金

1
找到了秘密的make-it-work开关:父pom的起始版本和模块必须相同!我的父pom以“ 1-SNAPSHOT”开头,模块的内容为“ 1.0.0-SNAPSHOT”。:)
斯金

1
随着聚合项目,聚集和子模块的版本的版本也没有必须是相同的。(例如,聚合器pom可能很少更改,并且可以保持特定版本,而各个子模块可以具有自己的发布周期)。关键属性指定的versions:set插件-DoldVersion='*',在mojohaus.org/versions-maven-plugin/set-mojo.html它明确地说,这个属性应该处理一个聚合项目时指定。
马修·怀斯

2
在什么条件下-DprocessAllModules实际起作用?它对我不起作用。
亚历克斯R

24

如果要完全自动化该过程(即,您想增加版本号而不必知道当前版本号是什么),则可以执行以下操作:

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

3
谢谢,@Crummy,您已经保存了我的一天
Maksim Kostromin


或者您可以使用-DoldVersion='*'
Matthew Wise

23

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


更新:请注意,以上是发布插件。如果您不释放,则可能要使用versions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

1
mvn version:set不会影响模块。
9ilsdx 9rvj 0lo


可以,当反应堆同时位于父级时,它会执行。当结构看起来不正确时,这令人困惑...
9ilsdx 9rvj 0lo

mvn release:update-versions -DautoVersionSubmodules即使我不释放它,对我来说也很好:-)
msa

11

我鼓励您阅读有关多模块(反应堆)构建的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>

是一个更好的链接


10
并具体寻找什么?
托尔比约恩Ravn的安德森

2
+1用于调出pom.xml文件的正确格式,但我同意(与@ThorbjørnRavnAndersen一起使用)阅读整本书以获取足够的信息是过分的。:p
Priidu Neemre

7
不幸的是,从父级继承版本信息并没有消除必须修改项目中所有pom文件的负担-因为它们都通过版本号引用了父级。
轻松

1
您可以使用versions-maven-plugin来处理所有这些问题,也可以使用maven-release-plugin来使用,因此您无需手动进行处理……
khmarbaise16年

5

versions:update-child-modules听起来像您要找的东西。您可以按照上述说明进行版本:设置,但这是更新父版本号的轻量级方法。对于子模块,我认为您应该删除<version>定义,因为它们将继承父模块的版本号。


3

最好的方法是,由于您打算将模块捆绑在一起,因此可以<dependencyManagement>在最外面的pom.xml(父模块)<project>标签下直接指定标签。它控制版本和组名。在您自己的模块中,只需在中指定<artifactId>标签pom.xml。它将从父文件获取版本。


我在pom.xml上找不到标签DependencyManagement。你在想别的吗?
ArturoTena

0

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

在childe模块中:

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

0

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

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.