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

dgenwo3n  于 12个月前  发布在  Maven
关注(0)|答案(5)|浏览(124)

我有以下问题:我希望能够使用插件动态更改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”属性,那么更改成功。如果我有它,但是,这样就不会进行任何更改,即使在pom.xml中定义了某些属性,我也希望能够对其进行更改
有什么建议吗?提前感谢。

sg3maiej

sg3maiej1#

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

字符串

8mmmxcuj

8mmmxcuj2#

正如你所发现的,你不能使用POM的properties部分中定义的动态更改的属性值。如果你想知道为什么,请阅读这个答案。
为了使用动态值和默认值,你必须动态设置默认值。你可以使用GMaven插件,并将其配置为构建中的第一个插件。请参阅Guillaume Darmont的答案。
下面是为什么需要这样做的解释。Maven将属性值替换两次:
1.在开始时(可能在有效POM的组装期间),它替换静态属性(在属性部分中声明)
1.在每次运行插件之前,它会再次替换属性,因此现在使用动态值
上面的意思是,如果你有静态声明<myProperty>,然后你使用这个属性,比如${myProperty},在你有机会动态修改它之前,值就被注入了。之后你可以动态修改值,但是占位符已经被替换了,所以动态值无处注入。
我也在这里回答了这个行为,也许在那里对某人解释得更好。

ttcibm8c

ttcibm8c3#

我不知道我是否完全理解你的问题,但你可以试试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}
希望这对你有帮助。

zlhcx6iw

zlhcx6iw4#

this works for me
除了我不得不改变财产不同的名字:

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

字符串
因为使用相同的名称,它不工作-值没有被覆盖。

9rygscc1

9rygscc15#

另一种选择是从一个插件写一个属性文件-像exec-maven-plugin - execution,然后通过properties-maven-plugin读取这个属性文件。例如:

<build>
  <plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <executions>              
          <execution>
            <id>write-some-file</id>
            <phase>pre-integration-test</phase>
            <configuration>
              <execuble>cmd</executable>
              <arguments>
                <argument>/c</argument>
                <argument>${project.basedir}\src\test\bin\some-batch-file-writing-file.bat</argument>
                <!-- Sample argument indicating name and path of property file to be generated-->
                <argument>${project.basedir}\target\classes\generated-file.properties</argument>
              </arguments>
            </configuration>
            <goals>
              <goal>exec</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>properties-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>read-some-file</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>read-project-properties</goal>
            </goals>
            <configuration>                 
              <files>
                <file>${project.basedir}/target/classes/generated-file.properties</file>
              </files>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
</build>

字符串

相关问题