2015-05-29 104 views
1

我想在maven中實現一種通過env變量將變量傳遞給POM的方式,但如果未提供,則使用默認值。Maven變量優先級:如何讓env變量比在pom.xml中的硬編碼值更重要?

我創建了minimalitic pom.xml,打印FOOFOOBAR變量。 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> 

現在,讓我們試着通過命令行傳遞一個值來運行,或通過環境變量:

[email protected] /d/mvn-tests 
$ mvn install | grep FOO 
    [echo] FOO = ${FOO} 
    [echo] FOOBAR = 1111111 

[email protected] /d/mvn-tests 
$ mvn install -DFOO=999 | grep FOO 
    [echo] FOO = 999 
    [echo] FOOBAR = 1111111 

[email protected] /d/mvn-tests 
$ FOO=999 mvn install | grep FOO 
    [echo] FOO = 999 
    [echo] FOOBAR = 1111111 

[email protected] /d/mvn-tests 
$ mvn install -DFOOBAR=555 | grep FOO 
    [echo] FOO = ${FOO} 
    [echo] FOOBAR = 555 

[email protected] /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> 

然後

[email protected] /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中取一個,如果沒有指定,那就換另一個?

回答

2

我想你最好使用Maven Profiles並根據它定義行爲/值。看看documentation

這樣你就可以根據需要微調變量。