【问题标题】:How can I update a property in a Maven POM?如何更新 Maven POM 中的属性?
【发布时间】:2014-09-21 23:04:03
【问题描述】:

我有两个顶级 Maven 项目,backendfrontend,它们按照各自的进度推进版本。由于每个模块都有多个模块,我在父/聚合 POM 的 dependencyManagement 部分中定义我的依赖版本,并使用版本号属性。

我想用frontend 上的版本号干净地更新属性,最好是任意的,但我可以接受需要一个实时上游版本来匹配。我试过使用versions:update-property,但这个目标似乎完全不起作用;不管是否真的有匹配的上游版本,我都会得到这个调试输出:

$ mvn versions:update-property -Dproperty=frontend.version -DnewVersion=0.13.2  -DautoLinkItems=false -X
...
[DEBUG] Searching for properties associated with builders
[DEBUG] Property ${frontend.version}
[DEBUG] Property ${frontend.version}: Looks like this property is not associated with any dependency...
[DEBUG] Property ${frontend.version}: Set of valid available versions is [0.9.0, 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5, 0.10.0, 0.10.1, 0.11.0, 0.12.0, 0.13.0, 0.13.1, 0.13.2, 0.13.3]
[DEBUG] Property ${frontend.version}: Restricting results to 0.13.2
[DEBUG] Property ${frontend.version}: Current winner is: null
[DEBUG] Property ${frontend.version}: Searching reactor for a valid version...
[DEBUG] Property ${frontend.version}: Set of valid available versions from the reactor is []
[INFO] Property ${frontend.version}: Leaving unchanged as 0.13.1
[INFO] ------------------------------------------------------------------------

我指定了-DautoLinkItems=false,这似乎没有效果; versions-maven-plugin 仍然扫描我所有的 POM 以查找匹配的依赖项,然后举手退出。我还尝试在插件配置中为该属性将searchReactor 设置为false。即使我明确表示要忽略它们,插件 (1) 似乎也错误地扫描了依赖项,并且 (2) 甚至过滤掉了明确的特定匹配项。

是否有一种简单的方法可以将 Maven 属性条目重写为特定值,或者强制 versions-maven-plugin 在不验证版本号的情况下执行我所说的操作,或者使用其他目标?我宁愿避免使用像 sed 这样不理解 XML 的工具(正如我在类似问题中看到的那样),但我会接受简单的 XPath 操作。

【问题讨论】:

  • 您有没有找到可行的解决方案?我正在努力解决 update-property 实际上不更新属性的完全相同的问题
  • 我遇到了与 versions:update-properties 类似的问题,版本为 org.codehaus.mojo:versions-maven-plugin:2.2, 2.3 似乎解决了这个问题。

标签: maven pom.xml versions-maven-plugin


【解决方案1】:

如何更新现有 POM 中的属性:

尝试在maven-resource-plugin中使用过滤:

  1. 在属性文件中指定版本;
  2. 添加带有此文件路径的自定义过滤器(在子 pom.xml 中,应注入依赖项);
  3. 属性文件中的更新版本;
  4. 运行构建。

优点:

  • 它应该可以工作;
  • 版本只指定一次;
  • 可以在版本控制下添加属性文件;
  • process-resources 是 Maven 生命周期的第一个步骤。

缺点:

  • 嗯,pom.xml 仍然使用占位符;
  • 从初始构建自动更新属性文件的额外工作(太复杂了,我想应该有更简单的解决方案)。

如何在构建时提供属性:

您可以通过构建参数指定任何属性。

例如,我的 pom.xml 中有如下属性:

<properties>
    <build.date>TODAY</build.date>
</properties>

要在构建期间更改它,我只需使用参数:

mvn compile -Dbuild.date=10.10.2010

我很确定它也适用于版本。此外,顶级项目的属性由子项目继承。

【讨论】:

  • 我需要实际更新 POM,而不仅仅是覆盖特定构建。应该更新版本控制中的 pom.xml 以指向最新的良好上游工件,以便开发构建知道拉它。
  • hm,似乎资源插件实际上允许多次设置值,我会更新我的答案。
【解决方案2】:

newVersion 参数的文档记录很差(这个插件的大部分内容也是如此)。通过检查集成测试,我发现它需要一个Maven version range 而不是一个简单的版本号。此外,它不允许您提供任何值 - 它必须是 Maven 可以解析的有效值。参数如果叫constrainRange就更好了

对于以后的其他人,试试这个:

mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2]  

如果您需要更新到快照,请确保将属性 allowSnapshots 设置为 true

mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2] -DallowSnapshots=true

【讨论】:

【解决方案3】:

当你在 pom.xml 中定义你的属性时,如果你想让 update-property 起作用,你必须声明一个间隔。

我的意思是,确保您的 frontend.version 定义如下:

<frontend.version>0.13.1</frontend.version>

那么当你设置 -DnewVersion=0.13.2 时插件不会将该值识别为有效值。如果您将其定义为间隔,则该插件可以正常工作。

<frontend.version>[0.13.0,0.13.2]</frontend.version>

在我的一项测试中,我得到以下结果:

mvn versions:update-property -Dproperty=absis.version -DnewVersion=[2.20.4] -X


    [DEBUG] Property ${test.version}: Set of valid available versions is [2.19.0-RC-REVISION-1, 2.19.0-RC0.1, 2.19.0-RC0.2, 2.19.0-RC0.3, 2.19.0-RC0.4, 2.19.0-RC0.5, 2.19.0-RC0.6, 2.19.0-RC0.7, 2.19.0-RC1, 2.19.0-RC2, 2.19.0-RC3, 2.19.0, 2.19.0-revision, 2.19.0-revision2, 2.19.0.2, 2.19.1, 2.19.2, 2.19.3, 2.19.4, 2.20.0-RC0, 2.20.0-RC0.1, 2.20.0-RC1, 2.20.0-RC2, 2.20.0-RC3, 2.20.0, 2.20.0-PRUEBA-VERSION, 2.20.0-PRUEBA-VERSION-2, 2.20.0-PRUEBA-VERSION-3, 2.20.0i-RC1, 2.20.0i-RC1.1, 2.20.0i, 2.20.0i.2, 2.20.1, 2.20.2, 2.20.4, 2.20.5, 2.20.5-LT, 2.20.5.1, 2.20.6i-RC1, 2.21.0-RCtest1, 2.21.0-RCtest2]
[DEBUG] Property ${test.version}: Restricting results to [2.20.4,2.20.4]
[DEBUG] Property ${test.version}: Current winner is: 2.20.4
[DEBUG] Property ${test.version}: Searching reactor for a valid version...
[DEBUG] Property ${test.version}: Set of valid available versions from the reactor is []
[INFO] Updated ${test.version} from [2.19.0,2.21.0-SNAPSHOT] to 2.20.4

购买您需要将属性值更改为一个范围。

很遗憾,因为我不能在我的 poms 定义中使用范围。

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,但没有发现任何改变文件中 pom 属性的内容。 我最终按照您的建议使用了 sed:

    cat pom.xml | sed -e "s%<util.version>0.0.1-SNAPSHOT</util.version>%<util.version>$bamboo_planRepository_branch</util.version>%" > pom.xml.transformed;
    rm pom.xml;
    mv pom.xml.transformed pom.xml;
    

    【讨论】:

      【解决方案5】:

      以下适用于versions:update-properties 目标。我认为这同样适用于版本:更新属性。

      默认情况下,只有在对应的属性定义和依赖声明出现在同一个 POM 文件中时,该目标才有效。

      例如,如果该属性在项目 POM 中定义,但在模块 POM 中的依赖项声明中使用,则项目 POM 中需要以下配置以通过版本插件自动更新。

        <properties>
          <my.version>3.7.11</my.version>
        </properties>
      ...
      
        <build>
          <plugins>
            <plugin>
               <groupId>org.codehaus.mojo</groupId>
               <artifactId>versions-maven-plugin</artifactId>
               <version>2.2</version>
               <configuration>
                 <properties>
                  <property>
                    <name>my.version</name>
                    <dependencies>
                      <dependency>
                        <groupId>com.acme.test</groupId>
                        <artifactId>demo-arti</artifactId>
                      </dependency>
                    </dependencies>
                  </property>
                </properties>
              </configuration>
            </plugin>
          </plugins>
        </build>
      

      当 Versions maven 插件针对 POM 运行并尝试更新属性时,插件配置生效。配置告诉 Versions 插件该属性将用于“在某处的 POM 中”声明的依赖项,即使不在当前 POM 中也是如此。

      【讨论】:

      • 这很好用,谢谢。在我的情况下,我将版本设置为 ${project.version},然后在子 pom 中将其设置为 ${project.parent.version},但它不适用于孙辈,因为父版本将被相对评估
      【解决方案6】:

      有没有一种简单的方法可以将 Maven 属性条目重写为特定值

      由于版本2.5我们可以使用set-propertydocumentation):

      mvn versions:set-property -Dproperty=your.property -DnewVersion=arbitrary_value

      如文档所述,set-property 目标不会对您指定的值执行任何“健全性检查”,因此它应该始终有效,但您应该谨慎使用。

      【讨论】:

      • 非常感谢,文档太荒谬了。如果我没记错,比插件mojohaus.org/versions-maven-plugin/index.html 的文档页面上没有提到 set-property - 还是我瞎了?
      • @JRA_TLL 你不是盲人——它根本不在插件的主页上。感谢您指出。
      • 是的.. set-property 不存在
      【解决方案7】:

      我对@9​​87654321@ 有问题,但设法使它与set-property 一起工作:

      mvn versions:set-property -Dproperty=mypropery -DnewVersion=myvalue
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-01
        • 2015-09-29
        • 2012-03-31
        • 2012-07-15
        • 2012-01-31
        • 1970-01-01
        相关资源
        最近更新 更多