Maven项目版本inheritance – 我必须指定父版本吗?

我有两个项目:父项目:A,子项目:B

在A / pom.xml中:

<groupId>com.dummy.bla</groupId> <artifactId>parent</artifactId> <version>0.1-SNAPSHOT</version> <packaging>pom</packaging> 

在B / pom.xml中,我有:

  <parent> <groupId>com.dummy.bla</groupId> <artifactId>parent</artifactId> <version>0.1-SNAPSHOT</version> </parent> <groupId>com.dummy.bla.sub</groupId> <artifactId>kid</artifactId> 

我想Binheritance父母的版本,所以我需要把0.1-SNAPSHOT的唯一的地方是A/pom.xml 。 但是,如果我从父节中的B/pom.xml删除<version>0.1-SNAPSHOT</version> ,maven会抱怨父节点的缺失版本。

有没有办法,我可以使用${project.version}或类似的东西,以避免在两个poms 01.-SNAPSHOT

不,没有。 你总是必须指定父母的版本。 幸运的是,在大多数情况下,它被inheritance为模块的版本。 而且,这个父母的版本声明被Maven Release Plugin自动碰撞了,所以 – 事实上 – 只要你使用Maven Release Plugin来释放或者只是碰撞版本,这个版本就不是问题了。

请注意,在某些情况下,这种行为确实非常不错,并且可能需要更多的灵活性。 有时候你想用一些以前的父母的版本来inheritance,但这不是主stream的情况。

Maven并不是为了这个目的而devise的,但是为了实现这个目标,有一个解决方法可能(也许带着副作用,你将不得不尝试一下)。 诀窍是告诉子项目通过它的相对path而不是纯粹的maven坐标find它的父项,除了在属性中外部化版本号:

父母

 <groupId>com.dummy.bla</groupId> <artifactId>parent</artifactId> <version>${global.version}</version> <packaging>pom</packaging> <properties> <!-- Unique entry point for version number management --> <global.version>0.1-SNAPSHOT</global.version> </properties> 

孩子pom

 <parent> <groupId>com.dummy.bla</groupId> <artifactId>parent</artifactId> <version>${global.version}</version> <relativePath>..</relativePath> </parent> <groupId>com.dummy.bla.sub</groupId> <artifactId>kid</artifactId> 

我用了一段时间为我的项目之一,没有具体的问题,除了maven在构build开始时logging了很多警告,这不是很优雅。

编辑

似乎maven 3.0.4不允许这样的configuration了。

最简单的方法来更新版本imo:

 mvn versions:set -DgenerateBackupPoms=false 

(在你的root / parent pom文件夹中这样做)。

你的poms被parsing,你被问到要设置哪个版本。

是的,但是你也可以使用"mvn release:update-versions -DdevelopmentVersion={version}"来更新你的POM中的版本号

Yanflea提到有一种方法可以解决这个问题。

在Maven 3.5.0中,您可以使用以下方式从父项目向下传输版本:

父POM.xml

 <project ...> <modelVersion>4.0.0</modelVersion> <groupId>com.mydomain</groupId> <artifactId>myprojectparent</artifactId> <packaging>pom</packaging> <version>${myversion}</version> <name>MyProjectParent</name> <properties> <myversion>0.1-SNAPSHOT</myversion> </properties> <modules> <module>modulefolder</module> </modules> ... </project> 

模块POM.xml

 <project ...> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.mydomain</groupId> <artifactId>myprojectmodule</artifactId> <version>${myversion}</version> <!-- This still needs to be set, but you can use properties from parent --> </parent> <groupId>se.car_o_liner</groupId> <artifactId>vinno</artifactId> <packaging>war</packaging> <name>Vinno</name> <!-- Note that there's no version specified; it's inherited from parent --> ... </project> 

你可以自由地改变任何你不想要的保留属性。