我想在maven中实现一种通过env变量将变量传递给POM的方法,但是如果没有提供则使用默认值。
我创建了一个可以打印pom.xml
和FOO
vars的minimalitic FOOBAR
。 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>
现在,让我们尝试通过从命令行或通过env变量传递值来运行:
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
明确指出env变量:
...
<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中取一个,如果没有指定,那么拿另一个?