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

回答:


130

プロパティの例については、次のようにします。

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

プロパティ定義全体を引用していることに注意してください。プロパティにスペースが含まれている場合に必要になります。


17
pomとコマンドラインの両方にプロパティがある場合は、コマンドラインが優先されることにも注意してください。これは、オーバーライド可能なデフォルトを提供するのに役立ちます。
ダンカーター、2015年

2
:我々はまた、あまりにものようなもの、このような複数の引数を渡すことができますmvn clean install "-Dprop1=value1" "-Dprop2=value2"
スミット

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

変数名をプロジェクトファイルとして指定できます。たとえば、プラグイン構成では、次のようにタグを1つだけ指定します。

<projectFile>${projectName}</projectFile>

次に、コマンドラインでプロジェクト名をパラメーターとして渡すことができます:-

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

mvnコマンドでブラウザ名と環境を提供したい。指定しない場合は、デフォルトが選択されます。どうやってするか?
ポール、

1
mvn clean package -DpropEnv=PROD

次に、POM.xmlでこのように使用します

<properties>
    <myproperty>${propEnv}</myproperty>
</properties>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.