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


当前回答

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

其他回答

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


不,没有。您总是必须指定父版本。幸运的是,它被继承为模块的版本,这在大多数情况下是可取的。此外,这个父版本声明会被Maven Release Plugin自动替换,所以——事实上——只要你使用Maven Release Plugin来发布或替换版本,你在两个地方有版本并不是问题。

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

你还可以用:

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

更新pom内的版本号。

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>

你可以自由地改变我的版本,任何你想要的不是保留属性。

<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坐标,你可以省略的是子版本。