Maven 变量优先级:如何使 env 变量比 pom.xml 中的硬编码值更重要?
Maven variables precedence: how to make env variable being more important than hardcoded value in pom.xml?
我想在 Maven 中实现一种通过环境变量将变量传递给 POM 的方法,但如果未提供则使用默认值。
我创建了一个打印 FOO
和 FOOBAR
变量的极简 pom.xml
。 FOOBAR
有一个默认值:
<project>
<groupId>com.example</groupId>
<artifactId>test</artifactId>
<version>sprint-SNAPSHOT</version>
<modelVersion>4.0.0</modelVersion>
<properties>
<FOOBAR>1111111</FOOBAR>
</properties>
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId><version>1.1</version>
<executions><execution>
<phase>validate</phase><goals><goal>run</goal></goals>
<configuration><tasks>
<echo>FOO = ${FOO}</echo>
<echo>FOOBAR = ${FOOBAR}</echo>
</tasks></configuration>
</execution></executions>
</plugin></plugins></build>
</project>
现在,让我们尝试 运行 通过从命令行或环境变量传递一个值:
me@mymachine /d/mvn-tests
$ mvn install | grep FOO
[echo] FOO = ${FOO}
[echo] FOOBAR = 1111111
me@mymachine /d/mvn-tests
$ mvn install -DFOO=999 | grep FOO
[echo] FOO = 999
[echo] FOOBAR = 1111111
me@mymachine /d/mvn-tests
$ FOO=999 mvn install | grep FOO
[echo] FOO = 999
[echo] FOOBAR = 1111111
me@mymachine /d/mvn-tests
$ mvn install -DFOOBAR=555 | grep FOO
[echo] FOO = ${FOO}
[echo] FOOBAR = 555
me@mymachine /d/mvn-tests
$ FOOBAR=555 mvn install | grep FOO
[echo] FOO = ${FOO}
[echo] FOOBAR = 1111111
最后一种情况是我不喜欢的:我希望 env 变量优先于 XML 顶部定义的 属性 (我希望 XML 中硬编码的那个是最后的手段检查)。
所以maven的优先级好像是这样的:
Command line param > hardcoded XML value > env variable
我想要:
Command line param > env variable > hardcoded XML value
有没有办法实现我想要的行为?
我注意到我可以使用 env.FOOBAR
明确指向环境变量:
...
<echo>FOO = ${FOO}</echo>
<echo>FOOBAR = ${FOOBAR}</echo>
<echo>env.FOOBAR = ${env.FOOBAR}</echo>
然后
me@mymachine /d/mvn-tests
$ FOOBAR=15 mvn install | grep FOO
[echo] FOO = ${FOO}
[echo] FOOBAR = 1111111
[echo] env.FOOBAR = 15
但是如何在 pom.xml
中说某事在 JS 文件中会是 ${env.FOOBAR || FOOBAR}
即从 env 中获取一个,如果未指定,则获取另一个?
我认为您最好使用 Maven 配置文件并基于此定义 behavior/values。看看 documentation.
这样您就可以根据需要微调变量。
我想在 Maven 中实现一种通过环境变量将变量传递给 POM 的方法,但如果未提供则使用默认值。
我创建了一个打印 FOO
和 FOOBAR
变量的极简 pom.xml
。 FOOBAR
有一个默认值:
<project>
<groupId>com.example</groupId>
<artifactId>test</artifactId>
<version>sprint-SNAPSHOT</version>
<modelVersion>4.0.0</modelVersion>
<properties>
<FOOBAR>1111111</FOOBAR>
</properties>
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId><version>1.1</version>
<executions><execution>
<phase>validate</phase><goals><goal>run</goal></goals>
<configuration><tasks>
<echo>FOO = ${FOO}</echo>
<echo>FOOBAR = ${FOOBAR}</echo>
</tasks></configuration>
</execution></executions>
</plugin></plugins></build>
</project>
现在,让我们尝试 运行 通过从命令行或环境变量传递一个值:
me@mymachine /d/mvn-tests
$ mvn install | grep FOO
[echo] FOO = ${FOO}
[echo] FOOBAR = 1111111
me@mymachine /d/mvn-tests
$ mvn install -DFOO=999 | grep FOO
[echo] FOO = 999
[echo] FOOBAR = 1111111
me@mymachine /d/mvn-tests
$ FOO=999 mvn install | grep FOO
[echo] FOO = 999
[echo] FOOBAR = 1111111
me@mymachine /d/mvn-tests
$ mvn install -DFOOBAR=555 | grep FOO
[echo] FOO = ${FOO}
[echo] FOOBAR = 555
me@mymachine /d/mvn-tests
$ FOOBAR=555 mvn install | grep FOO
[echo] FOO = ${FOO}
[echo] FOOBAR = 1111111
最后一种情况是我不喜欢的:我希望 env 变量优先于 XML 顶部定义的 属性 (我希望 XML 中硬编码的那个是最后的手段检查)。
所以maven的优先级好像是这样的:
Command line param > hardcoded XML value > env variable
我想要:
Command line param > env variable > hardcoded XML value
有没有办法实现我想要的行为?
我注意到我可以使用 env.FOOBAR
明确指向环境变量:
...
<echo>FOO = ${FOO}</echo>
<echo>FOOBAR = ${FOOBAR}</echo>
<echo>env.FOOBAR = ${env.FOOBAR}</echo>
然后
me@mymachine /d/mvn-tests
$ FOOBAR=15 mvn install | grep FOO
[echo] FOO = ${FOO}
[echo] FOOBAR = 1111111
[echo] env.FOOBAR = 15
但是如何在 pom.xml
中说某事在 JS 文件中会是 ${env.FOOBAR || FOOBAR}
即从 env 中获取一个,如果未指定,则获取另一个?
我认为您最好使用 Maven 配置文件并基于此定义 behavior/values。看看 documentation.
这样您就可以根据需要微调变量。