54

我有大约 400 个插件的大型 Maven (Tycho) 项目。

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

有没有办法只在一个地方为所有 POM:s 指定版本?

我希望有人会这样想:

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

8 回答 8

31

如果您有父项目,您可以在父 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>

然后在你的孩子 pom 中你必须这样做:

    <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

于 2013-10-01T18:17:49.020 回答
25

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

  • 在父 pom.xml 你应该有(不在里面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
mvn versions:commit # Necessary to remove the backup file pom.xml

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

于 2018-02-28T00:46:03.647 回答
16

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

[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 发布插件,它会自动为您执行此操作。

于 2014-06-17T13:26:21.043 回答
13

请参阅Maven - 用户论坛“版本”包含一个表达式,但应该是一个常量。添加新版本的更好方法?

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

部署的 pom 不会解析属性值,因此任何依赖该 pom 的人都会将依赖项视为未使用 ${ } 插值的字符串,并且在您的构建过程中会出现很多欢闹。

在 maven 2.1.0 和/或 2.2.0 中,尝试部署具有已解析属性的 pom... 这超出预期,这就是不推荐这两个版本的原因,2.2.1 是推荐的 2.x 版本.

于 2019-03-27T11:05:37.080 回答
11

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

实际上,您也可以省略相同的 GAV 属性<parent>,因为它们将被继承。结果看起来像这样:

<project>
    <modelVersion>4.0.0</modelVersion>

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

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

    ...
</project>

有关更多信息,尤其是有关如何在发布期间解析占位符的信息,请参阅Maven CI 友好版本 | 多模块设置

于 2018-02-28T12:30:14.787 回答
5

如果您使用的是 Maven 3,解决此问题的一种方法是使用版本插件 http://www.mojohaus.org/versions-maven-plugin/

特别是命令,

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

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

与发布插件不同,它不会尝试与您的源代码管理进行对话

于 2017-10-05T20:42:39.327 回答
-1

我有两个建议给你

  1. 对所有工件使用CI 友好修订。可以-Drevision=2.0.1.mvn/maven.config文件中添加。所以基本上你只在一个位置定义你的版本。
  2. 对于所有外部依赖项,在父文件中创建一个属性。您可以使用Apache Camel Parent Pom作为参考
于 2020-07-01T16:27:04.363 回答
-2

pom.xml 的版本应该是有效的

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

这个版本不应该像 2.2.4。ETC

于 2020-08-26T18:24:54.147 回答