Pom.xml'de özellikler olarak Maven'den komut satırı argümanlarını iletme


101

Komut satırından pom.xmldosyadaki özelliklere argümanlar geçirmek mümkün müdür ? örneğin koşuyorummvn ... argument

ve pom.xml'de

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

Yardım için teşekkürler.


Doğrudan istediğiniz şey değil, ancak maven profilleri bunun için yararlı olabilir
Sig

evet profilleri biliyorum. <projectFile> ... </projectFile> 'de projenin kesin adı olan maven-soapui-eklentisini kullanıyorum. Yaklaşık 10 projem var ve her proje için yeni profil istemiyorum. Mvn'yi çalıştırmak için bağımsız değişken kullanmak istiyorum ... project1'i çalıştırmak için project1 ve project2'yi çalıştırmak için mvn ... project2'yi çalıştırmak için
hudi

Yanıtlar:


135

Mülk örneğiniz için şunları yapın:

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

Tüm mülk tanımının etrafındaki alıntılara dikkat edin. Mülkünüz boşluk içeriyorsa bunlara ihtiyacınız olacak.


19
Ayrıca, hem pom'da hem de komut satırında bir özelliğiniz varsa, komut satırının öncelikli olduğunu unutmayın. Bu, geçersiz kılınabilen varsayılanlar sağlamak için yararlı olabilir.
dan carter

2
Bunun gibi birden çok argümanı da iletebiliriz, örneğin:mvn clean install "-Dprop1=value1" "-Dprop2=value2"
Sumit

15

Bunu çözmek için özellikler eklentisini kullandım.

Özellikler pom'da tanımlanır ve bir my.properties dosyasına yazılır, burada daha sonra Java kodunuzdan erişilebilirler.

Benim durumumda, bu özellikler dosyasına erişmesi gereken test kodudur, bu nedenle pom'da özellikler dosyası maven'in testOutputDirectory'sine yazılır:

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

Özelliklerin uygulama kodunuz tarafından erişilebilir olmasını istiyorsanız outputDirectory kullanın:

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

Daha kapsamlı bir örnek arayanlar için (özellik etiketlerinin isimlendirilmesinin onları pom dosyasında başka bir yerde alma yeteneğini nasıl etkilediğini anlamadığım için bunu çalıştırmak biraz uğraşmam gerekti), pom'um aşağıdaki gibi görünüyor:

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

Ve komut satırında:

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

Dolayısıyla bu özelliklere Java kodundan erişilebilir:

 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'daki özellik dosyam $ {app.env} ile aynı değeri veriyor, maven komut satırından seçmiyor, özellik adı böyle bir değere eşit mi olmalı? <app.env> $ {app.env} </ app.env>
Sujith

14

Pom.xml içinde

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

.....

Bu örnekte, pom'u herhangi bir bağımsız değişken olmadan çalıştırdığınızda, mvn clean installvarsayılan profil çalıştırılacaktır.

İle yürütüldüğünde mvn -Denv=win64 clean install

win64 profili yürütülecektir.

Lütfen http://maven.apache.org/guides/introduction/introduction-to-profiles.html bakın


Hangi profili kullandığından beri mvn clean -Pwin64 olmalı mı?
sendon1982

6

Değişken isimlerini proje dosyaları olarak verebilirsiniz. Örneğin, eklenti yapılandırmanızda aşağıdaki gibi yalnızca bir etiket verin: -

<projectFile>${projectName}</projectFile>

Ardından komut satırında proje adını parametre olarak iletebilirsiniz: -

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

Mvn komutunda tarayıcı adı ve ortamı sağlamak istiyorum. Sağlamazsam varsayılanı seçecektir. Bu nasıl yapılır?
paul

1
mvn clean package -DpropEnv=PROD

Ardından POM.xml'de bu şekilde kullanın

<properties>
    <myproperty>${propEnv}</myproperty>
</properties>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.