让Maven子POM与父POM具有相同的版本号?

13

我有一个多模块(聚合)的Maven项目,还从父pom继承属性。所以在我的父pom.xml中有这个:

<groupId>com.something.project</groupId>
<artifactId>MyProject</artifactId>
<packaging>pom</packaging>
<version>1.0.123</version>

<modules>
    <module>ModuleA</module>
    <module>ModuleB</module>
    <module>ModuleC</module>
</modules>

我希望所有子模块都继承父模块的版本号1.0.123,但是子模块的pom.xml仍需要硬编码指定父模块的版本号(ModuleA pom.xml 示例):

<artifactId>ModuleA</artifactId>
<name>Some Amazing Thing</name>

<parent>
    <relativePath>../</relativePath>
    <artifactId>MyProject</artifactId>
    <version>1.0.123</version>
    <groupId>com.something.project</groupId>
</parent>

我该如何在父POM中仅放置版本号,并使模块继承它而无需在多个地方进行更新?到目前为止,我已经尝试过${project.version}和${project.parent.version},但Maven似乎非常不高兴。也不能完全删除版本引用。

有人对此有一个好的答案吗?


1
Aven似乎对此非常不满,请解释。 - jmj
2
这是一个经典的鸡生蛋、蛋生鸡的问题。你希望版本号能够从父级继承下来,但是又不想指定要从哪个父级版本中继承版本号。 - Mark Peters
我认为这不是Maven构建的工作方式(这就是为什么子模块首先必须引用父POM)。每个模块的构建有些独立。 - jtahlborn
@jtahlborn - 哎呀,如果是那样的话,我们可能无法从这里到达目的地,就像俗话说的那样。如果是这种情况,这可能根本不可能实现。我会把这个问题保持开放一段时间,看看是否有人知道一个好的解决方法。我真的很讨厌在两个地方硬编码相同的信息 - 这只会引发麻烦。 - user3120173
子pom文件中是否指定了版本号? - jtahlborn
显示剩余2条评论
2个回答

7
一般来说,如果您使用maven管理版本,将父版本放在子模块pom中不是问题。当您运行maven发布插件时,它会为您更新所有子模块中的所有版本。
更新:
如果您想自己管理版本,则可能会遇到一些麻烦。我很确定您至少需要在每个pom中指定一次版本号。您可以通过编写一些脚本来简化递归搜索和替换(而不是手动执行)。
作为一点背景:maven是以“最佳(maven)方法”的理念构建的。如果您遵循这种方式,事情通常会变得非常简单并且工作得非常好。以不同的方式做事情通常是可能的,但是您离“最佳方式”越远,事情就会变得更加痛苦(或不可能)。

很遗憾,我们没有使用Maven发布插件,我们所有版本管理都是手动完成的。我不知道为什么。:( - user3120173
我必须同意你关于“最佳(maven)做事方式”的评论 - 确实似乎只要你按照Maven的方式做,就没问题,但如果你偏离了这个方式,就会有麻烦。谢谢你的帮助。 - user3120173
使用 mvn versions:set 命令在整个层次结构中设置版本。Maven 一直需要父版本才能正确解析 pom,但我认为它已经改变了..?? - Niels Bech Nielsen
关于“Maven的做法”的回复,不幸的是,Maven的一些文档明确推荐一些实际上不起作用的事情。也许它们曾经有效,但现在已经演变成了另一种风格。例如,文档中说如果父模块使用<modules>...</modules>的方式,那么子模块根本不需要指定父模块的部分。但这已经不再正确了。 - Jesse Chisholm

2

我认为这个问题已经在Maven中,你可以从父POM继承版本吗?得到了解答。

我尝试了该解决方案,它对我有效(使用Apache Maven 3.0.5)。但是,它有一个限制,如果我们直接进入子POM并构建,它将无法解析版本变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接