Passaggio di argomenti della riga di comando da Maven come proprietà in pom.xml


97

È possibile passare argomenti dalla riga di comando alle proprietà nel pom.xmlfile? per esempio corromvn ... argument

e in pom.xml

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

Grazie per l'aiuto.


Non direttamente quello che stai chiedendo, ma i profili esperti possono essere utili per questo
Sig

sì, so di profili. Sto usando maven-soapui-plugin dove in <projectFile> ... </projectFile> è definito il nome del progetto. Ho circa 10 progetti e non voglio per ogni progetto un nuovo profilo. Voglio usare l'argomento per eseguire mvn ... project1 per eseguire project1 e mvn ... project2 per eseguire
project2

Risposte:


130

Per il tuo esempio di proprietà fai:

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

Nota le virgolette attorno alla definizione dell'intera proprietà. Ne avrai bisogno se la tua proprietà contiene spazi.


17
Nota anche che se hai sia una proprietà nel pom che sulla riga di comando, la riga di comando ha la precedenza. Questo può essere utile per fornire valori predefiniti sovrascrivibili.
dan carter

2
Possiamo anche passare più argomenti come questo, qualcosa come:mvn clean install "-Dprop1=value1" "-Dprop2=value2"
Sumit

14

All'interno di 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>

.....

In questo esempio, quando esegui il pom senza alcun argomento mvn clean install, verrà eseguito il profilo predefinito.

Quando eseguito con mvn -Denv=win64 clean install

Il profilo win64 verrà eseguito.

Fare riferimento a http://maven.apache.org/guides/introduction/introduction-to-profiles.html


Da quando si utilizza quale profilo, dovrebbe essere mvn clean -Pwin64?
sendon1982

14

Ho usato il plugin delle proprietà per risolvere questo problema.

Le proprietà vengono definite nel pom e scritte in un file my.properties, da cui è possibile accedervi dal codice Java.

Nel mio caso è il codice di test che deve accedere a questo file delle proprietà, quindi nel pom il file delle proprietà viene scritto nella testOutputDirectory di Maven:

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

Usa outputDirectory se vuoi che le proprietà siano accessibili dal codice della tua app:

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

Per coloro che cercano un esempio più completo (mi ci è voluto un po 'di tempo per farlo funzionare perché non capivo come la denominazione dei tag delle proprietà influisca sulla capacità di recuperarli altrove nel file pom), il mio pom appare come segue:

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

E sulla riga di comando:

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

Quindi è possibile accedere a queste proprietà dal codice 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");

Il mio file di proprietà in java sta dando lo stesso valore di $ {app.env} non lo sta prelevando dalla riga di comando maven, il nome della proprietà dovrebbe essere uguale a un valore come questo? <app.env> $ {app.env} </ app.env>
Sujith

6

È possibile assegnare nomi di variabili come file di progetto. Ad esempio, nella configurazione del tuo plugin, dai solo un tag come di seguito: -

<projectFile>${projectName}</projectFile>

Quindi sulla riga di comando puoi passare il nome del progetto come parametro: -

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

Voglio fornire il nome del browser e l'ambiente nel comando mvn. Se non lo fornisco, sceglierà l'impostazione predefinita. Come farlo?
paul

1
mvn clean package -DpropEnv=PROD

Quindi usando in questo modo in POM.xml

<properties>
    <myproperty>${propEnv}</myproperty>
</properties>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.