Meneruskan argumen baris perintah dari Maven sebagai properti di pom.xml

98

Apakah mungkin untuk meneruskan argumen dari baris perintah ke properti dalam pom.xmlfile? misalnya saya larimvn ... argument

dan di pom.xml

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

Terima kasih atas bantuannya.

hudi
sumber
Tidak secara langsung apa yang Anda minta tetapi profil maven mungkin berguna untuk ini
Sig
ya saya tahu tentang profil. Saya menggunakan maven-soapui-plugin di mana di <projectFile> ... </projectFile> adalah nama proyek yang ditentukan. Saya memiliki sekitar 10 proyek dan saya tidak ingin untuk setiap proyek profil baru. Saya ingin menggunakan argumen untuk menjalankan mvn ... project1 untuk menjalankan project1 dan mvn ... project2 untuk menjalankan project2
hudi

Jawaban:

132

Untuk contoh properti Anda, lakukan:

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

Perhatikan kutipan di sekitar definisi properti secara keseluruhan. Anda akan membutuhkannya jika properti Anda memiliki spasi.

Alexander Pogrebnyak
sumber
18
Perhatikan juga, jika Anda memiliki properti di pom, dan di baris perintah, baris perintah akan diutamakan. Ini dapat berguna untuk menyediakan default yang dapat diganti.
dan carter
2
Kami juga dapat memberikan beberapa argumen seperti ini juga, seperti:mvn clean install "-Dprop1=value1" "-Dprop2=value2"
Sumit
14

Di dalam 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>

.....

Dalam contoh ini ketika Anda menjalankan pom tanpa argumen, mvn clean installprofil default akan dieksekusi.

Saat dijalankan dengan mvn -Denv=win64 clean install

profil win64 akan dieksekusi.

Silakan merujuk http://maven.apache.org/guides/introduction/introduction-to-profiles.html

Abhishek2k6
sumber
Sejak menggunakan profil yang mana, haruskah itu mvn clean -Pwin64?
sendon1982
14

Saya menggunakan plugin properti untuk menyelesaikan ini.

Properti didefinisikan di pom, dan ditulis ke file my.properties, yang kemudian dapat diakses dari kode Java Anda.

Dalam kasus saya itu adalah kode uji yang perlu mengakses file properti ini, jadi di pom file properti ditulis ke testOutputDirectory maven:

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

Gunakan outputDirectory jika Anda ingin properti dapat diakses oleh kode aplikasi Anda:

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

Bagi mereka yang mencari contoh yang lebih lengkap (saya perlu sedikit mengotak-atik agar ini berfungsi karena saya tidak mengerti bagaimana penamaan tag properti memengaruhi kemampuan untuk mengambilnya di tempat lain di file pom), pom saya terlihat sebagai berikut:

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

Dan di baris perintah:

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

Jadi properti ini dapat diakses dari kode 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");
Menggoyangkan
sumber
File properti saya di java memberikan nilai yang sama dengan $ {app.env} itu tidak mengambilnya dari baris perintah maven, apakah nama properti harus sama dengan nilai seperti ini? <app.env> $ {app.env} </ app.env>
Sujith
6

Anda dapat memberi nama variabel sebagai file proyek. Misalnya dalam konfigurasi plugin Anda hanya memberikan satu tag seperti di bawah ini: -

<projectFile>${projectName}</projectFile>

Kemudian pada baris perintah Anda dapat mengirimkan nama proyek sebagai parameter: -

mvn [your-command] -DprojectName=[name of project]
Hariom Tomar
sumber
Saya ingin memberikan nama browser dan lingkungan dalam perintah mvn. Jika saya tidak menyediakannya akan memilih default. Bagaimana cara melakukannya?
paul
1
mvn clean package -DpropEnv=PROD

Kemudian gunakan seperti ini di POM.xml

<properties>
    <myproperty>${propEnv}</myproperty>
</properties>
sendon1982
sumber