从Maven传递命令行参数作为pom.xml中的属性

是否有可能从命令行传递参数到pom.xml文件中的属性? 例如我运行mvn ... argument

并在pom.xml中

 <properties> <myproperty> here should add argument from command line</myproperty> </properties> 

感谢您的帮助。

对于你的财产的例子做:

 mvn install "-Dmyproperty=my property from command line" 

注意整个属性定义的引号。 如果你的财产包含空格,你将需要他们。

在pom.xml里面

 <project> 

…..

 <profiles> <profile> <id>linux64</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <build_os>linux</build_os> <build_ws>gtk</build_ws> <build_arch>x86_64</build_arch> </properties> </profile> <profile> <id>win64</id> <activation> <property> <name>env</name> <value>win64</value> </property> </activation> <properties> <build_os>win32</build_os> <build_ws>win32</build_ws> <build_arch>x86_64</build_arch> </properties> </profile> </profiles> 

…..

 <plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>target-platform-configuration</artifactId> <version>${tycho.version}</version> <configuration> <environments> <environment> <os>${build_os}</os> <ws>${build_ws}</ws> <arch>${build_arch}</arch> </environment> </environments> </configuration> </plugin> 

…..

在这个例子中,当你运行没有任何参数的POM mvn clean install默认configuration文件将执行。

当执行mvn -Denv=win64 clean install

win64configuration文件将执行。

请参考http://maven.apache.org/guides/introduction/introduction-to-profiles.html

我使用属性插件来解决这个问题。

属性在pom中定义,并写入到my.properties文件中,然后可以从Java代码访问它们。

在我的情况下,它是需要访问这个属性文件的testing代码,所以在POM中,属性文件被写入到maven的testOutputDirectory中:

 <configuration> <outputFile>${project.build.testOutputDirectory}/my.properties</outputFile> </configuration> 

如果您希望应用代码可以访问属性,请使用outputDirectory:

 <configuration> <outputFile>${project.build.outputDirectory}/my.properties</outputFile> </configuration> 

对于那些寻找一个更完整的例子(我花了一些小把戏来获得这个工作,因为我不明白属性标记的命名如何影响在Pom文件中检索它们的能力),我的POM看起来如下:

 <dependencies> <dependency> ... </dependency> </dependencies> <properties> <app.env>${app.env}</app.env> <app.port>${app.port}</app.port> <app.domain>${app.domain}</app.domain> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.20</version> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>properties-maven-plugin</artifactId> <version>1.0.0</version> <executions> <execution> <phase>generate-resources</phase> <goals> <goal>write-project-properties</goal> </goals> <configuration> <outputFile>${project.build.testOutputDirectory}/my.properties</outputFile> </configuration> </execution> </executions> </plugin> </plugins> </build> 

并在命令行上:

 mvn clean test -Dapp.env=LOCAL -Dapp.domain=localhost -Dapp.port=9901 

所以这些属性可以从Java代码中访问:

  java.io.InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("my.properties"); java.util.Properties properties = new Properties(); properties.load(inputStream); appPort = properties.getProperty("app.port"); appDomain = properties.getProperty("app.domain"); 

您可以将variables名称作为项目文件。 例如在你的插件configuration中只给出一个标签,如下所示:

 <projectFile>${projectName}</projectFile> 

然后在命令行上,您可以传递项目名称作为参数: –

 mvn [your-command] -DprojectName=[name of project]