Maven项目版本继承 - 我是否必须指定父版本?

时间:2012-05-14 11:02:29

标签: inheritance maven

我有两个项目:父项目: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>

我希望B从父级继承该版本,因此我需要将0.1-SNAPSHOT放在A/pom.xml的唯一位置是<version>0.1-SNAPSHOT</version>。但是,如果我从父节点下的B/pom.xml中删除${project.version},maven会抱怨父节点的丢失版本。

有没有办法可以使用01.-SNAPSHOT或类似的东西来避免在两个poms中都有{{1}}?

8 个答案:

答案 0 :(得分:80)

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在构建开始时记录了很多警告,这不是很优雅。

修改

似乎maven 3.0.4不再允许这样的配置。

答案 1 :(得分:69)

更新IMO版本的最简单方法:

$ mvn versions:set -DgenerateBackupPoms=false

(在root / parent pom文件夹中执行此操作)。

您的POM已解析,并且您被问到要设置的版本。

答案 2 :(得分:62)

编辑:由于Maven 3.5.0使用${revision}占位符,因此有一个很好的解决方案。有关详细信息,请参阅FrVaBe's answer。对于以前的Maven版本,请参阅下面的原始答案。


不,没有。您始终必须指定父版本。幸运的是,它被继承为模块的版本,在大多数情况下是可取的。此外,这个父母的版本声明会被Maven Release Plugin自动提升,所以 - 实际上 - 只要你使用Maven Release Plugin发布或只是碰撞版本,你就不会有2个版本的问题。

请注意,在某些情况下,此行为实际上非常正常,并提供了您可能需要的更多灵活性。有时你想使用以前父版本的一些版本继承,但这不是主流的情况。

答案 3 :(得分:29)

自Maven 3.5.0起,您可以使用${revision}占位符。此处记录了用法:Maven CI Friendly Versions

简而言之,父pom 如下所示(从Apache文档中引用):

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>18</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>
  <modules>
    <module>child1</module>
    ..
  </modules>
</project>

像这样的孩子pom

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.maven.ci</groupId>
    <artifactId>ci-parent</artifactId>
    <version>${revision}</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-child</artifactId>
   ...
</project>

您还必须使用Flatten Maven Plugin生成包含用于部署的专用版本号的pom文档。 HowTo记录在链接的文档中。

@khmarbaise也写了一篇有关此功能的不错的blob帖子:Maven: POM Files Without a Version in It?

答案 4 :(得分:17)

正如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>

您可以随意将myversion更改为您想要的不属于保留属性的任何内容。

答案 5 :(得分:16)

你也可以使用:

$ mvn release:update-versions -DdevelopmentVersion={version}

更新POM中的版本号。

答案 6 :(得分:0)

使用mvn -N versions:update-child-modules更新子pom的版本

https://www.mojohaus.org/versions-maven-plugin/examples/update-child-modules.html

答案 7 :(得分:0)

<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的pom的父块中删除版本,我认为您不能这样做,groupId,artifactId和版本指定了父pom坐标的版本,您可以忽略的是孩子的版本。