如何更新Maven POM中的属性?

时间:2014-07-30 10:29:53

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

我有两个顶级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以查找匹配的依赖项,然后退出并退出。我还尝试在插件配置中为该属性设置searchReactorfalse。看来插件(1)错误地扫描了依赖关系,即使我明确表示忽略它们,(2)甚至过滤掉明确的特定匹配。

是否有一种简单的方法可以将Maven属性条目重写为特定值,强制versions-maven-plugin执行我所说的内容而无需验证版本号或使用其他目标?我更倾向于避免像sed这样的工具,它不能理解XML(正如我在类似的问题中所推荐的那样),但我可以使用简单的XPath操作。

7 个答案:

答案 0 :(得分:14)

newVersion参数记录错误(与此插件的大部分内容一样)。通过检查集成测试,我发现它需要Maven version range而不是简单的版本号。此外,它不允许您提供任何值 - 它必须是Maven可以解析的有效值。如果调用<input name="cardNumInput" required type="text" size="20" class="form-control" ng-model="userInput.paymentParams.CardNumber" ng-minlength="13" ng-maxlength="19"/>

,参数会更好

对于将来的其他人,请尝试以下方法:

constrainRange

如果您需要更新到快照,请确保将属性mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2] 设置为true

allowSnapshots

答案 1 :(得分:13)

  

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

从版本2.5开始,我们可以使用set-propertydocumentation):

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

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

答案 2 :(得分:4)

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

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

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

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

    缺点:

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

    如何提供构建时间:

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

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

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

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

    mvn compile -Dbuild.date=10.10.2010
    

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

答案 3 :(得分:2)

我遇到了同样的问题,发现没有任何内容可以改变文件中的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;

答案 4 :(得分:0)

在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定义中使用范围。

答案 5 :(得分:0)

以下内容适用于版本:update-properties目标。我认为同样适用于版本:update-property。

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

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

  <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中”所声明的依赖关系。

答案 6 :(得分:0)

我在update-property上遇到了问题,但设法使其在set-property上有效:

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