我遇到以下问题: 我希望能够使用插件动态更改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中定义了某个属性
有什么建议吗? 提前谢谢
答案 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两次替换属性值:
上述含义是,如果您有静态声明<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)
exept我必须将属性更改为其他名称:
<source>
import org.apache.commons.lang.StringUtils;
project.properties["my.enc"] = StringUtils.lowerCase(project.properties["db_user_base.enc"]);
</source>
因为同名它不起作用 - 值没有被覆盖。