5

我遇到以下问题:我希望能够使用插件动态更改 Maven 属性。例如,如果我配置了一个属性,例如:

<properties>
   <someProperty>value</someProperty>
</properties>

我想有一种方法在 Maven 运行期间将其更改为“value-2”(不是之前!例如,我不想在命令行中使用 -DsomeProperty=value-2)

我将尝试解释我的用例以澄清:我的 pom.xml 设置了一些默认属性。但是,我正在运行一个任务,该任务创建一个带有 name=value 对的属性文件以匹配我的属性(例如,如果我的 pom.xml 中有诸如 someProperty=value 之类的属性,则 run.properties 文件具有 someProperty=value- 2 属性)。在一些 Maven 运行期间,我想将我的属性文件的位置传递给它,并让它更改我的 pom.xml 中的默认属性。我已经尝试使用“properties-maven-plugin”来实现这个目标,但这似乎只有在我没有在 pom.xml 本身中配置属性的情况下才有效。也就是说,如果我的 pom.xml 中的部分没有“someProperty”属性,则更改成功。如果我有的话,

有什么建议么?提前致谢

4

4 回答 4

4

我一直在玩 gmavenplus-plugin,它取代了旧的 gmaven-plugin。在此示例中,我尝试有条件地将 docker 图像上传到 SNAPSHOT 和 RELEASE docker 注册表,类似于 maven-deploy-plugin 的工作方式。使用此代码,我解析版本并设置指向正确存储库的属性。一旦你进入 groovy,你就可以像使用常规的 java 实现的 maven 插件一样乱用 maven。

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.10</version>
    <executions>
      <execution>
        <id>parse-version</id>
        <goals>
          <goal>parse-version</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

  <plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.5</version>
    <dependencies>
      <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.4.4</version>
        <scope>runtime</scope>
      </dependency>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.0.13</version>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
    <executions>
      <execution>
        <id>add-dynamic-properties</id>
        <phase>initialize</phase>
        <goals>
          <goal>execute</goal>
        </goals>
        <configuration>
          <scripts>
            <script>
<![CDATA[
import java.text.SimpleDateFormat;

Date now = new Date()
SimpleDateFormat timestamp = new SimpleDateFormat("yyyyMMdd.HHmmss");

myver  = "${project.version}"
myqual = "${parsedVersion.qualifier}"
myrepo = (myqual == "SNAPSHOT") ? "${docker.repo.snapshot}" : "${docker.repo.release}"
mytag  = (myqual == "SNAPSHOT") ? myver + "-" + timestamp.format(now) : myver

project.properties.setProperty('docker.repo.name', myrepo)
project.properties.setProperty('docker.image.tag', mytag) 

log.info("Docker repository name is " + project.properties['docker.repo.name'])
log.info("Docker image tag is " + project.properties['docker.image.tag'])
]]>
            </script>
          </scripts>
        </configuration>
      </execution>
    </executions>
  </plugin>
于 2016-03-01T18:56:38.643 回答
3

正如您所发现的,您不能使用在 POM 的属性部分中定义的属性的动态更改值。如果您想知道原因,请阅读此答案。

为了使用动态值和默认值,您必须动态设置默认值。您可以为此使用 GMaven 插件并将其配置为构建中的第一个插件。见纪尧姆达蒙的回答。

这是为什么需要这样做的解释。Maven 两次替换属性值:

  1. 在开始时(可能在有效 POM 的组装过程中)它替换了静态属性(在属性部分中声明)
  2. 在每次运行插件之前,它会再次替换属性,因此现在使用动态值

上面的意思是,如果你有静态声明<myProperty>,然后你使用这个属性,就像${myProperty}在你有机会动态改变它之前注入值一样。稍后您可以动态更改该值,但占位符已被替换,因此无法注入动态值。

我也在这里回答了这种行为,也许对某人来说更好地解释一下。

于 2014-11-18T18:19:35.207 回答
1

我不知道我是否完全理解你的问题,但你可以试试Groovy Maven 插件

<plugin>
    <groupId>org.codehaus.groovy.maven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <version>1.4</version>
    <executions>
      <execution>
        <id>add-dynamic-properties</id>
        <phase>initialize</phase>
        <goals>
          <goal>execute</goal>
        </goals>
        <configuration>
          <source>
            if (someCondition) {
                project.properties.myDynamicProperty = 'myDynamicValue'
            }
          </source>
        </configuration>
      </execution>
    </executions>
  </plugin>

然后,只需使用${myDynamicProperty}.

希望这可以帮助。

于 2013-07-02T13:19:09.930 回答
1

这对我有用

除了我不得不将属性更改为不同的名称:

<source>
    import org.apache.commons.lang.StringUtils;
    project.properties["my.enc"] = StringUtils.lowerCase(project.properties["db_user_base.enc"]);
</source>

因为使用相同的名称它不起作用 - 值没有被覆盖。

于 2014-10-23T21:28:02.123 回答