Maven变量优先级:如何使env变量比pom.xml中的硬编码值更重要?

时间:2015-05-29 13:13:38

标签: maven pom.xml

我想在maven中实现一种通过env变量将变量传递给POM的方法,但是如果没有提供则使用默认值。

我创建了一个可以打印pom.xmlFOO vars的minimalitic FOOBARFOOBAR有一个默认值:

<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中取一个,如果没有指定,那么拿另一个?

1 个答案:

答案 0 :(得分:2)

我认为你最好使用Maven Profiles并根据它定义行为/值。看看documentation

通过这种方式,您可以根据需要微调变量。