在执行maven版本之前强制执行属性替换:resolve-ranges

时间:2014-02-11 20:08:09

标签: maven

我们有一组库,我们想要滚动主要版本的同步,但是在主要版本更改之间会有独立“浮动”的次要版本。为了将它们表示为pom中的依赖项,我们使用自定义属性。我们的pom看起来像这样:

<project ...>
  ...
  <groupId>org.our.stuff</groupId>
  <artifactId>our-thing</artifactId>
  ...
  <properties>
    <shared.version>[1.4,1.5)</shared.version>
  </properties>
  ...
  <dependencies>
    <dependency>
      <groupId>org.our.stuff</groupId>
      <artifactId>library-foo</artifactId>
      <version>${shared.version}</version>
    </dependency>
    <dependency>
      <groupId>org.our.stuff</groupId>
      <artifactId>library-bar</artifactId>
      <version>${shared.version}</version>
    </dependency>
    <dependency>
      <groupId>org.our.stuff</groupId>
      <artifactId>library-baz</artifactId>
      <version>${shared.version}</version>
    </dependency>
  <dependency>
<project>

假设这些库的实际版本是

  • library-foo:1.4.1
  • library-bar:1.4.3
  • library-baz:1.4.5

现在,我们有一个构建脚本,它使用versions:resolve-ranges将范围版本替换为其实际当前版本。 (我们这样做是为了创建一个带有所有依赖关系的pom版本“固定”,用于回滚目的。)不幸的是,resolve-ranges的行为是查看使用属性shared.version的所有依赖项,确定什么是最常见的版本,然后在属性中替换它。所以输出看起来像这样:

<project ...>
  ...
  <groupId>org.our.stuff</groupId>
  <artifactId>our-thing</artifactId>
  ...
  <properties>
    <shared.version>1.4.1</shared.version>
  </properties>
  ...
  <dependencies>
    <dependency>
      <groupId>org.our.stuff</groupId>
      <artifactId>library-foo</artifactId>
      <version>${shared.version}</version>
    </dependency>
  ...

显然这是遵循update-properties mojo所描述的行为?无论如何,这并没有让我们明白我们想要的东西,因为它最终构建了两个库的旧版本。

我们想要的是将每个依赖项的实际当前版本放在那里并保留属性。 (或者更改属性,我并不在乎,如果依赖版本被更改则变得无关紧要。)所以我们想要输出如下:

  <dependencies>
    <dependency>
      <groupId>org.our.stuff</groupId>
      <artifactId>library-foo</artifactId>
      <version>1.4.1</version>
    </dependency>
    <dependency>
      <groupId>org.our.stuff</groupId>
      <artifactId>library-bar</artifactId>
      <version>1.4.3</version>
    </dependency>
    <dependency>
      <groupId>org.our.stuff</groupId>
      <artifactId>library-baz</artifactId>
      <version>1.4.5</version>
    </dependency>
  <dependencies>

我无法想办法让版本插件执行此操作。解决此问题的一种方法是,在通过resolve-ranges运行pom之前强制在shared.version上进行属性替换。但我找不到插件或其他强制替换的方法。有没有人知道如何做到这一点,或者其他想法来获得我们想要的输出?

1 个答案:

答案 0 :(得分:1)

好的,所以我发现maven replacer plugin可用于在运行resolve-ranges之前手动强制替换shared.version属性。我只是在我们的脚本中调用它(在使用mvn help:evaluate以验证有问题的pom有shared.version)。

对我来说似乎仍然有些笨拙,并且需要在每个使用shared.version的pom中添加以下配置。如果有一种方法可以在replace-ranges本身中获得这种行为,或者至少是一个直接进行属性替换而不是使用本质上是全局搜索并在文件中替换的插件,那肯定会很好。

  <plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.2</version>
    <configuration>
      <file>pom.xml</file>
      <regex>true</regex>
      <token>\$\{shared\.version\}</token>
      <value>${shared.version}</value>
    </configuration>
  </plugin>