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

Maven variables precedence: how to make env variable being more important than hardcoded value in pom.xml?

我想在 Maven 中实现一种通过环境变量将变量传递给 POM 的方法,但如果未提供则使用默认值。

我创建了一个打印 FOOFOOBAR 变量的极简 pom.xmlFOOBAR 有一个默认值:

<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.

这样您就可以根据需要微调变量。