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


97

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

并在pom.xml中

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

感谢您的帮助。


不是直接问您要的内容,但maven的配置文件可能对此有用
Sig

是的,我知道个人资料。我正在使用maven-soapui-plugin,其中<projectFile> ... </ projectFile>是项目的定义名称。我有大约10个项目,我不想为每个项目创建新的配置文件。我想使用参数来运行mvn ... project1以运行project1和mvn ... project2以运行project2
hudi 2011年

Answers:


130

对于您的财产示例,请执行以下操作:

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

注意整个属性定义的引号。如果您的媒体资源包含空格,则将需要它们。


17
还要注意,如果同时在pom和命令行中都具有属性,则命令行优先。这对于提供可覆盖的默认值很有用。
丹·卡特,2015年

2
我们也可以像这样传递多个参数,例如:mvn clean install "-Dprop1=value1" "-Dprop2=value2"
Sumit

14

内部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将执行默认配置文件。

当执行 mvn -Denv=win64 clean install

win64配置文件将被执行。

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


由于使用哪个配置文件,它应该是mvn clean -Pwin64吗?
sendon1982

14

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

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

就我而言,是测试代码需要访问该属性文件,因此在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");

我在Java中的属性文件给出的值与$ {app.env}相同,而不是从maven命令行中选取,属性名称是否应等于这样的值?<app.env> $ {app.env} </ app.env>
Sujith,

6

您可以将变量名指定为项目文件。例如,在您的插件配置中,仅提供一个标签,如下所示:-

<projectFile>${projectName}</projectFile>

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

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

我想在mvn命令中提供浏览器名称和环境。如果我不提供,它将选择默认值。怎么做?
保罗

1
mvn clean package -DpropEnv=PROD

然后在POM.xml中像这样使用

<properties>
    <myproperty>${propEnv}</myproperty>
</properties>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.