maven动态更改属性(运行时)

时间:2013-07-02 12:29:39

标签: maven properties

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

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

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

我将尝试解释我的用例以澄清: 我的pom.xml有一些默认属性设置。但是,我正在运行一个任务,创建一个名称=值对的属性文件来匹配我的属性(例如,如果我的pom.xml中有一个属性,例如someProperty = value,则run.properties文件有someProperty = value- 2财产)。在某些maven运行期间,我想将它传递给我的属性文件的位置,并让它更改我的pom.xml中的默认属性。 我已经尝试使用“properties-maven-plugin”来实现这个目标,但是如果我没有在pom.xml本身配置属性,这似乎只能起作用。也就是说,如果我的pom.xml中的部分没有“someProperty”属性,那么更改将成功运行。如果我确实拥有它,但是没有进行任何更改,我希望能够更改它,即使pom.xml中定义了某个属性

有什么建议吗? 提前谢谢

4 个答案:

答案 0 :(得分:4)

我一直在玩gmavenplus-plugin,它取代了旧的gmaven-plugin。在这个例子中,我尝试有条件地将docker镜像上传到SNAPSHOT和RELEASE docker注册表,类似于maven-deploy-plugin的工作方式。使用此代码,我解析版本并设置指向正确repo的属性。一旦你进入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>

答案 1 :(得分:2)

如您所知,您无法使用POM的属性部分中定义的动态更改的属性值。如果你想知道原因,请在最后阅读这个答案。

要使用动态值和默认值,您必须动态设置默认值。您可以使用GMaven插件并将其配置为构建中的第一个插件。请参阅Guillaume Darmont的回答。

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

  1. 在开头(可能在组装有效的POM期间)它取代静态属性(在属性部分中声明)
  2. 在每次运行插件之前,它会再次替换属性,因此现在使用动态值
  3. 上述含义是,如果您有静态声明<myProperty>,之后您使用此属性${myProperty},则在您有机会动态更改之前注入该值。稍后您可以动态更改值,但占位符已被替换,因此无法注入动态值。

    我也回答了这种行为here,或许对某人有更好的解释。

答案 2 :(得分:0)

我不知道我是否完全理解您的问题,但您可以尝试Groovy Maven Plugin

<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}

希望这有帮助。

答案 3 :(得分:0)

this works for me

exept我必须将属性更改为其他名称:

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

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