带有财产的Maven版本

时间:2013-10-01 18:11:04

标签: java maven version

我有大量的Maven(第谷)项目,大约有400个插件。

我们在每个POM文件中指定了应用程序版本。

有没有办法如何在一个地方指定所有POM的版本?

我希望有人会这样想:

<properties>
<buildVersion>1.1.2-SNAPSHOT</buildVersion>
</properties>

....

<version>${buildVersion}</version>

我们有父pom.xml

<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>pom</packaging>

然后在每个POM中引用父POM:

<parent>
  <artifactId>build.parent</artifactId>
  <groupId>company</groupId>
  <relativePath>../build.parent/pom.xml</relativePath>
  <version>1.1.2-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>artifact</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>

8 个答案:

答案 0 :(得分:29)

如果您有父项目,您可以在父pom和子项中设置版本,您可以使用 $ {project.version} $ {version}引用同级库。 属性。

如果您想避免在每个孩子中重复父母的版本:您可以这样做:

<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>${my.version}</version>
<packaging>pom</packaging>

<properties>
<my.version>1.1.2-SNAPSHOT</my.version>
</properties>

然后在你的孩子们身上,你必须这样做:

    <parent>
      <artifactId>build.parent</artifactId>
      <groupId>company</groupId>
      <relativePath>../build.parent/pom.xml</relativePath>
      <version>${my.version}</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <groupId>company</groupId>
    <artifactId>artifact</artifactId>
    <packaging>eclipse-plugin</packaging>

    <dependencies>
        <dependency> 
           <groupId>company</groupId>
           <artifactId>otherartifact</artifactId>   
           <version>${my.version}</version>
or
           <version>${project.version}</version>
        </dependency>
    </dependencies>

HTH

答案 1 :(得分:13)

使用版本的属性会生成以下警告:

[WARNING]
[WARNING] Some problems were encountered while building the effective model for xxx.yyy.sandbox:Sandbox:war:0.1.0-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ xxx.yyy.sandbox:Sandbox:${my.version}, C:\Users\xxx\development\gwtsandbox\pom.xml, line 8, column 14
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]

如果您的问题是由于您正在切换版本而必须在多个地方更改版本,那么正确的做法是使用Maven Release Plugin来自动执行此操作。

答案 2 :(得分:6)

使用3.5或更高版本的Maven版本,您应该能够在父节中使用占位符(例如$ {revision}),并且在pom的其余部分内,您可以使用${project.version}

实际上,您也可以省略parent之外的项目属性,这些属性是相同的,因为它们将被继承。结果看起来像这样:

<project>
    <parent>
    <artifactId>build.parent</artifactId>
    <groupId>company</groupId>
    <relativePath>../build.parent/pom.xml</relativePath>
    <version>${revision}</version>  <!-- use placeholder -->
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>artifact</artifactId>
    <!-- no 'version', no 'groupId'; inherited from parent -->
    <packaging>eclipse-plugin</packaging>

    ...
</project>

有关详细信息,尤其是有关如何在发布期间解析占位符的信息,请参阅Maven CI Friendly Versions | Multi Module Setup

答案 3 :(得分:3)

正确答案是这个(示例版本):

  • 在父pom.xml中,您应该({strong>不在properties内):

    <version>0.0.1-SNAPSHOT</version>
    
  • 在所有子模块中,您应该:

    <parent>
        <groupId>com.vvirlan</groupId>
        <artifactId>grafiti</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    

所以它是硬编码的。

现在,要更新版本,请执行以下操作:

mvn versions:set -DnewVersion=0.0.2-SNAPSHOT

并且所有400个模块都将更新父版本。

答案 4 :(得分:2)

如果您正在使用Maven 3,解决此问题的一个选项是使用版本插件 http://www.mojohaus.org/versions-maven-plugin/

特别是命令,

mvn versions:set -DnewVersion=2.0-RELEASE
mvn versions:commit

这会将父母和子女poms更新为2.0-RELEASE。您可以在此之前将其作为构建步骤运行。

与发布插件不同,它不会尝试与源代码控制进行对话

答案 5 :(得分:0)

请参见 Maven-用户论坛'version' contains an expression but should be a constant. Better way to add a new version?

  

这就是为什么这是一个糟糕的计划。

     

要部署的pom不会解析属性值,因此   任何依赖于该pom的人都将把依赖项作为未用$ {}插值的字符串,并且会在您中引起很多欢呼声   构建过程。

     

在Maven 2.1.0和/或2.2.0中,尝试使用以下命令部署pom   解析的属性...这超出了预期,这就是为什么这些   不建议使用两个版本,建议的2.x版本是2.2.1。

答案 6 :(得分:0)

pom.xml的版本应该有效

<groupId>com.amazonaws.lambda</groupId>
<artifactId>lambda</artifactId>
<version>2.2.4 SNAPSHOT</version>
<packaging>jar</packaging>

此版本不应类似于2.2.4。等等

答案 7 :(得分:-1)

我有两个建议给你

  1. 对所有工件使用CI Friendly Revision。您可以在-Drevision=2.0.1文件中添加.mvn/maven.config。因此,基本上,您只能在一个位置定义版本。
  2. 对于所有外部依赖性,在父文件中创建一个属性。您可以使用Apache Camel Parent Pom作为参考