我有两个项目:父项目:A,子项目:B
一个/ 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>
我想要B继承父版本,所以在我的情况下,我需要把0.1-SNAPSHOT的唯一地方是A/pom.xml。但是如果我从父部分的B/pom.xml中删除<version>0.1-SNAPSHOT</version>, maven会抱怨父部分缺少版本。
是否有一种方法可以使用${project。Version}或类似的东西,以避免出现01。-快照在两个poms?
正如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>
你可以自由地改变我的版本,任何你想要的不是保留属性。
foxx的答案适用于单个项目,但当我从另一个项目引用一个模块时就不适用了(pom.xml仍然存储在我的.m2中,带有属性而不是版本)。
然而,如果你将它与flat -maven-plugin结合使用,它就可以工作,因为它会生成具有正确版本的poms,而不是属性。
我在插件定义中唯一更改的选项是outputDirectory,默认情况下它是空的,但我更喜欢将它放在target中,这是在我的.gitignore配置中设置的:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.0.1</version>
<configuration>
<updatePomFile>true</updatePomFile>
<outputDirectory>target</outputDirectory>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
</executions>
</plugin>
插件配置放在父文件pom.xml中
正如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>
你可以自由地改变我的版本,任何你想要的不是保留属性。
Maven不是这样设计的,但是有一个解决方案可以实现这个目标(可能有副作用,您必须尝试一下)。诀窍是告诉子项目通过它的相对路径而不是它的纯maven坐标来找到它的父项目,并且在属性中外部化版本号:
父母pom
<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在构建之初记录了很多警告,这不是很好。
EDIT
maven 3.0.4似乎不再允许这样的配置了。