具有父 POM 的多模块项目的 Maven 版本控制
Posted
技术标签:
【中文标题】具有父 POM 的多模块项目的 Maven 版本控制【英文标题】:Maven versioning of multi-module projects with parent POM 【发布时间】:2012-07-13 11:14:17 【问题描述】:这与上一个问题略有不同,因为我有单独的多模块和父 POM:In a Maven project, how can I automatically update the version all child modules, plus the parent?
我正在尝试更新我的 POM 以从开发快照版本变为已发布的版本号。我已经用谷歌搜索了这个问题,尝试了发布和版本插件,但似乎没有什么能够处理我相当简单的设置。
遵循已发布的 Maven 最佳实践,并在可以避免的情况下尽量不重复信息,我最终为我的多模块项目获得了以下结构。 有一个由通用 pom-parent.xml 定义的单一版本; B 依赖于 A。
我觉得标准插件无法处理看似相当基本的设置有点令人惊讶,我是否遗漏了什么?
我想出的解决方法都不是完全令人满意的:
将产品版本定义为属性有点不稳定,由于用户 settings.xml 或其他技巧,相同的模块源可能会获得不同的版本
合并根 pom.xml 和 pom-parent.xml 并将我目前在根 pom 中维护的产品范围的构建步骤移动到一个专用模块中;并希望std插件能够工作......没有尝试过。
有什么建议吗?
root/pom-parent.xml:下面所有 POM 的父级
<project...>
<groupId>acme</groupId>
<artifactId>ParentPom</artifactId>
<packaging>pom</packaging>
<version>1.0.0-SNAPSHOT</version>
root/pom.xml:以 A 和 B 作为子模块的多模块项目
<project ...>
<parent>
<groupId>acme</groupId>
<artifactId>ParentPom</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>acme</groupId>
<artifactId>Product</artifactId>
<packaging>pom</packaging>
<modules>
<module>A</module>
<module>B</module>
</modules>
根/A/pom.xml:
<project ...>
<parent>
<groupId>acme</groupId>
<artifactId>ParentPom</artifactId>
<relativePath>../parent-pom.xml</relativePath>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>acme</groupId>
<artifactId>A</artifactId>
<packaging>jar</packaging>
root/B/pom.xml:
<project ...>
<parent>
<groupId>acme</groupId>
<artifactId>ParentPom</artifactId>
<relativePath>../parent-pom.xml</relativePath>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>acme</groupId>
<artifactId>B</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>acme</groupId>
<artifactId>A</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
【问题讨论】:
【参考方案1】:如果你有如下结构:
root
+-- pom.xml (1.0-SNAPSHOT)
!
+-- module1
! +-- pom.xml (1.0-SNAPSHOT)
+-- module2
+-- pom.xml (1.0-SNAPSHOT)
所有模块(模块 1 和模块 2)都使用 root 作为它们的父模块,如下所示:
<parent>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
如果您还想为其他项目考虑其他默认设置,例如 pluginManagement 或 dependencyManagement,您必须使用单独的父 pom,它必须是一个单独的仅包含 pom.xml 的 maven 项目。此外,该项目将单独部署和发布。如果这样做,您可以在上述结构的根 pom 中将其用作父级。
如果您想发布,您只需进入上述结构的根文件夹,版本号等将自动递增。
mvn -B release:prepare release:perform
【讨论】:
我已经排除了“其他默认设置”,这不需要单独的项目,我只需要一个 pom-parent.xml。当版本在父 POM 中定义时,发布插件将不起作用,这是我避免在每个模块中复制的方法。 你在谈论一个 pom-parent.xml,这是我提到的 root/pom.xml 没有其他。另一个公司的 pom 必须是一个单独的项目才能在 root/pom.xml 中将其用作父级。该版本仅在父 pom (root/pom.xml) 中定义一次,并在父引用中的模块上使用。 我想我理解您的建议,这相当于我最初提到的“将产品范围的构建步骤移至单独的模块”,不是吗?因为如果 pom 是每个模块 pom 的父级,这些步骤就不能存在于 root/pom.xml 中......也许这是正确的做法,我会尝试一下 - 谢谢! 完全同意。正是这样。 这个maven插件也可以解决这种问题:mojo.codehaus.org/flatten-maven-plugin/examples/…以上是关于具有父 POM 的多模块项目的 Maven 版本控制的主要内容,如果未能解决你的问题,请参考以下文章