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

使用来自versions-maven插件的versions:set

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT


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

如果输入有误,请执行

mvn versions:revert


之后,或者

mvn versions:commit


对结果感到满意。


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

评论


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

– AmanicA
2011年7月2日在21:49

除了版本号:set外,还可以指定-DgenerateBackupPoms = false,因为默认情况下,此插件备份原始pom文件。

–Maksim Sorokin
2012年11月15日在8:49

这就是版本的意义:提交:“删除pom的初始备份,从而接受更改。”

–迈克尔·拉法格(Michael Laffargue)
2014年4月28日在9:52

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

–史蒂芬(Stephan)
2014年6月12日14:51

@MichaelLaffargue mvn版本:提交似乎删除了先前pom.xml生成的备份文件

–克里斯·罗克韦尔(Cris Rockwell)
15年8月30日在17:39

#2 楼

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

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


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

当然,不要忘记在所有模块中提交更改,您也可以使用同一开关进行更改:

mvn versions:commit -DprocessAllModules


您可以决定完全放弃备份POMS,并通过一个命令完成所有操作:

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


评论


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

–lostintranslation
18-09-14在6:52

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

–SiKing
19年5月17日在18:24

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

–SiKing
19年5月17日在19:13

对于聚合器项目,聚合器的版本和子模块的版本不必相同。 (例如,您的聚合器pom更改很少,可以保持特定版本,而各个子模块可以具有自己的发布周期)。指定给版本:set插件的关键属性是-DoldVersion ='*',在mojohaus.org/versions-maven-plugin/set-mojo.html上,它明确表示应在处理聚合器项目时指定此属性。

–马修·怀斯(Matthew Wise)
19年5月23日在16:08

-DprocessAllModules在什么条件下实际起作用?它对我不起作用。

– Alex R
19年6月23日在17:59

#3 楼

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

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


评论


谢谢,@疯狂,你救了我的一天

–马克西姆·科斯特罗姆(Maksim Kostromin)
19年1月30日在17:52

mojohaus.org/build-helper-maven-plugin/parse-version-mojo.html

– Se Song
19年2月1日在2:44

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

–马修·怀斯(Matthew Wise)
19年5月23日在16:09

太好了,谢谢! SNAPSHOT的示例:mvn build-helper:parse-version版本:set -DnewVersion = \ $ {parsedVersion.majorVersion}。\ $ {parsedVersion.minorVersion}。\ $ {parsedVersion.nextIncrementalVersion} -SNAPSHOT版本:commit

–oikonomopo
20-10-22在15:15

#4 楼

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


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

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT


评论


mvn version:set不会影响模块。

– 9ilsdx 9rvj 0lo
17年9月12日在12:52

是的,我用它。设置当前项目的版本,并根据更改将更改传播到必要的任何子模块上。

– Nishant
17年9月13日在17:53

可以,当反应堆同时位于父级时,它会执行。当结构看起来不对时会令人困惑...

– 9ilsdx 9rvj 0lo
17年9月14日在7:01

mvn release:update-versions -DautoVersionSubmodules对我来说效果很好,即使我没有发布:-)

–msa
20年3月2日在15:06

#5 楼

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


这是一个更好的链接。

评论


并具体寻找什么?

–索比昂·拉文·安德森(ThorbjørnRavn Andersen)
2013年1月3日15:56

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

– Priidu Neemre
16 Jan 27'9:09



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

–轻松逗乐的史蒂芬
16年8月5日在21:41

您可以使用versions-maven-plugin处理所有这些事情,也可以使用maven-release-plugin,因此不需要手动处理...

–khmarbaise
16年8月6日在9:45

#6 楼

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

#7 楼

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

评论


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

– Arturo Tena
2014年9月3日于17:58

#8 楼

上面给出的解决方案也很长时间对我们有用:
mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

但是它昨天停止了工作,由于在版本-maven-plugin中的最新错误,我们发现了它
我们的(临时)解决方法是按如下方式更改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>
+        


#9 楼

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


#10 楼

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

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


#11 楼

我一直在寻找:
<properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
</properties>