如何更新Maven POM中的属性?

如何更新Maven POM中的属性?,maven,pom.xml,versions-maven-plugin,Maven,Pom.xml,Versions Maven Plugin,我有两个顶级Maven项目,后端和前端,它们以各自的速度推进版本。由于每个模块都有多个模块,因此我在父级/聚合POM的dependencyManagement部分中定义依赖项版本,并使用一个属性作为版本号 我想在前端上用版本号干净地更新属性,最好是任意更新,但我可以接受需要实时上游版本来匹配的情况。我尝试过使用,但这个目标似乎完全没有功能;无论是否存在匹配的上游版本,我都会得到以下调试输出: $ mvn versions:update-property -Dproperty=frontend.v

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

我想在
前端
上用版本号干净地更新属性,最好是任意更新,但我可以接受需要实时上游版本来匹配的情况。我尝试过使用,但这个目标似乎完全没有功能;无论是否存在匹配的上游版本,我都会得到以下调试输出:

$ 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
,这似乎没有效果<代码>版本maven插件仍然会扫描我所有的POM,寻找匹配的依赖项,然后举手退出。我还尝试在插件配置中将该属性的
searchReactor
设置为
false
。看起来插件(1)错误地扫描了依赖项,即使我明确地说忽略它们,(2)甚至过滤掉了一个明确的特定匹配项


有没有一种简单的方法可以将Maven属性项重写为特定值,或者强制
versions Maven plugin
执行我说的操作而不验证版本号,或者使用另一个目标?我宁愿避免像sed这样不懂XML的工具(正如我在一个类似的问题中看到的建议),但我可以使用简单的XPath操作。

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

尝试在以下位置使用筛选:

  • 在属性文件中指定版本
  • 将带有路径的自定义筛选器添加到此文件(在子pom.xml中,应在其中注入依赖项)
  • 更新属性文件中的版本
  • 运行构建
  • 优点:

    • 它应该起作用
    • 版本只指定一次
    • 可以在版本控制下添加属性文件
    • 流程资源是maven生命周期的第一步
    缺点:

    • 那么,pom.xml仍然使用占位符
    • 从初始构建自动更新属性文件的额外工作(太复杂了,我想应该有更简单的解决方案)
    如何在构建时提供性能:

    可以通过生成参数指定任何属性

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


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

    newVersion参数的文档记录很差(此插件的大部分也是如此)。通过检查集成测试,我发现它需要的不是一个简单的版本号。此外,它不允许您提供任何值—它必须是Maven可以解析的有效值。如果调用
    constraintrange

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

    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
    

    在pom.xml中定义属性时,如果希望更新属性有效,则必须声明为间隔

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

    <frontend.version>0.13.1</frontend.version>
    
    购买您需要将属性值更改为一个范围


    遗憾的是,我无法在pom定义中使用range。

    我也遇到了同样的问题,但在文件中没有发现任何更改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;
    
    cat pom.xml | sed-e“s%0.0.1-SNAPSHOT%$bambor\u planRepository\u branch%>pom.xml.transformed;
    rm pom.xml;
    mv pom.xml.transformed pom.xml;
    
    以下内容适用于版本:更新属性目标。我认为这同样适用于版本:update属性

    默认情况下,只有在同一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>
    
    
    3.7.11
    ...
    org.codehaus.mojo
    版本maven插件
    2.2
    我的版本
    com.acme.test
    演示艺术
    
    当版本maven插件针对POM运行并尝试更新属性时,插件配置开始生效。配置告诉Versions插件,该属性将用于“在某个地方的POM中”声明的依赖项,即使不在当前POM中

    有没有简单的方法将Maven属性项重写为特定值

    由于版本
    2.5
    我们可以使用
    set属性
    ():

    mvn版本:设置属性-Dproperty=your.property-DnewVersion=任意_值


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

    我对
    更新属性
    有问题,但设法使其与
    set属性
    一起工作:

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

    我需要实际更新POM,而不仅仅是覆盖特定的构建。版本控制中的
    pom.xml
    应该更新,以指向最新的良好上游工件,以便开发构建知道如何使用它。嗯,看起来资源插件实际上允许多次设置值,我将更新我的答案。你有没有找到一个可行的解决方案?我遇到了一个完全相同的问题,更新属性实际上没有更新属性。我在
    版本:更新属性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
    
    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;
    
      <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>
    
    mvn versions:set-property -Dproperty=mypropery -DnewVersion=myvalue