34

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

我想用版本号干净地更新属性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 操作。

4

7 回答 7

41

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

由于2.5我们可以使用版本set-property文档):

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

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

于 2017-10-16T23:36:58.107 回答
18

newVersion 参数的文档记录很差(这个插件的大部分内容也是如此)。通过检查集成测试,我发现它需要一个Maven 版本范围而不是一个简单的版本号。此外,它不允许您提供任何值 - 它必须是 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
于 2015-10-08T09:50:41.330 回答
5

如何更新现有 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

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

于 2014-07-30T10:44:03.770 回答
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;
于 2016-08-23T12:07:54.743 回答
2

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

默认情况下,仅当相应的属性定义和依赖项声明出现在同一个 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>

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

于 2017-04-07T14:04:56.227 回答
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 定义中使用范围。

于 2016-07-06T07:42:14.947 回答
0

我有问题update-property,但设法使它与set-property

mvn versions:set-property -Dproperty=mypropery -DnewVersion=myvalue
于 2020-10-22T06:23:55.837 回答