228

我有两个项目:父项目: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-SNAPSHOTA/pom.xml. 但是,如果我<version>0.1-SNAPSHOT</version>B/pom.xml父部分下删除,maven 会抱怨缺少父版本。

有没有一种方法可以让我使用${project.version}或类似的方法来避免同时01.-SNAPSHOT使用两个 pom?

4

9 回答 9

126

从 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>

像这样的孩子

<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 插件来生成 pom 文档,其中包含用于部署的专用版本号。HowTo 记录在链接的文档中。

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

于 2018-08-22T14:24:33.640 回答
101

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


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

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

于 2012-05-14T11:20:25.467 回答
89

Maven 并非旨在以这种方式工作,但存在一种解决方法来实现此目标(可能有副作用,您必须尝试一下)。诀窍是告诉子项目通过其相对路径而不是其纯 maven 坐标找到其父项目,并且除了在属性中外部化版本号:

家长会

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

儿童绒球

<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 不再允许这样的配置。

于 2012-05-14T12:04:46.843 回答
88

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

$ mvn versions:set -DgenerateBackupPoms=false

(在您的根/父 pom 文件夹中执行此操作)。

您的 POM 被解析,并询问您要设置哪个版本。

于 2015-07-03T12:03:32.920 回答
23

正如 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任何您想要的非保留属性。

于 2017-10-17T13:03:47.027 回答
18

您还可以使用:

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

更新 POM 中的版本号。

于 2013-04-11T10:49:32.673 回答
13

eFox的答案适用于单个项目,但不是当我从另一个项目引用模块时(pom.xml 仍然存储在我.m2的属性而不是版本中)。

但是,如果将它与 结合使用,它会起作用flatten-maven-plugin,因为它会生成具有正确版本的 pom,而不是属性。

我在插件定义中更改的唯一选项是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

于 2018-02-26T15:06:26.257 回答
3

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

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

于 2019-09-11T16:48:58.800 回答
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和version指定了父的pom坐标,您可以省略的是子版本。

于 2020-06-16T07:57:23.900 回答