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>
你可以自由地改变任何你不想要的保留属性。