我有两个顶级Maven项目backend
和frontend
,它们以各自的速度推进版本。由于每个模块都有多个模块,因此我在父/聚合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操作。
答案 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-property
(documentation):
mvn versions:set-property -Dproperty=your.property -DnewVersion=arbitrary_value
如上所述,set-property
目标不会对您指定的值执行任何“完整性检查”,因此它应始终有效,但您应谨慎使用。
答案 2 :(得分:4)
如何更新现有POM中的属性:
尝试在maven-resource-plugin中使用过滤:
优点:
缺点:
如何提供构建时间:
您可以通过构建参数指定任何属性。
例如,我在 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