Passer des arguments de ligne de commande depuis Maven en tant que propriétés dans pom.xml


97

Est-il possible de passer des arguments de la ligne de commande aux propriétés dans le pom.xmlfichier? par exemple je coursmvn ... argument

et dans pom.xml

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

Merci pour l'aide.


Pas directement ce que vous demandez, mais les profils maven peuvent être utiles pour cela
Sig

oui je connais les profils. J'utilise maven-soapui-plugin où dans <projectFile> ... </projectFile> est le nom défini du projet. J'ai environ 10 projets et je ne veux pas pour chaque nouveau profil de projet. Je veux utiliser l'argument pour exécuter mvn ... project1 pour exécuter project1 et mvn ... project2 pour exécuter
project2

Réponses:


130

Pour votre exemple de propriété, faites:

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

Notez les guillemets autour de la définition de la propriété entière. Vous en aurez besoin si votre propriété contient des espaces.


17
Notez également que si vous avez à la fois une propriété dans le pom et sur la ligne de commande, la ligne de commande est prioritaire. Cela peut être utile pour fournir des valeurs par défaut remplaçables.
dan carter

2
Nous pouvons également passer plusieurs arguments comme celui-ci, quelque chose comme:mvn clean install "-Dprop1=value1" "-Dprop2=value2"
Sumit

14

À l'intérieur de 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>

.....

Dans cet exemple, lorsque vous exécutez le pom sans aucun argument, mvn clean installle profil par défaut s'exécute.

Lorsqu'il est exécuté avec mvn -Denv=win64 clean install

Le profil win64 sera exécuté.

Veuillez vous reporter à http://maven.apache.org/guides/introduction/introduction-to-profiles.html


Depuis que vous utilisez quel profil, doit-il être mvn clean -Pwin64?
sendon1982

14

J'ai utilisé le plugin de propriétés pour résoudre ce problème.

Les propriétés sont définies dans le pom et écrites dans un fichier my.properties, où elles sont ensuite accessibles à partir de votre code Java.

Dans mon cas, c'est le code de test qui doit accéder à ce fichier de propriétés, donc dans le pom, le fichier de propriétés est écrit dans testOutputDirectory de maven:

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

Utilisez outputDirectory si vous souhaitez que les propriétés soient accessibles par le code de votre application:

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

Pour ceux qui recherchent un exemple plus complet (il m'a fallu un peu de bidouillage pour que cela fonctionne car je ne comprenais pas comment la dénomination des balises de propriétés affecte la capacité de les récupérer ailleurs dans le fichier pom), mon pom ressemble à ceci:

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

Et sur la ligne de commande:

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

Ainsi, ces propriétés sont accessibles à partir du code 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");

Mon fichier de propriétés en java donne la même valeur que $ {app.env}, il ne le sélectionne pas à partir de la ligne de commande maven, le nom de la propriété doit-il être égal à la valeur comme ceci? <app.env> $ {app.env} </ app.env>
Sujith

6

Vous pouvez donner des noms de variables sous forme de fichiers de projet. Par exemple, dans la configuration de votre plugin, ne donnez qu'une seule balise comme ci-dessous: -

<projectFile>${projectName}</projectFile>

Ensuite, sur la ligne de commande, vous pouvez passer le nom du projet en paramètre: -

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

Je souhaite fournir le nom et l'environnement du navigateur dans la commande mvn. Si je ne le fournis pas, il choisira par défaut. Comment faire ça?
paul

1
mvn clean package -DpropEnv=PROD

Puis en utilisant comme ça dans POM.xml

<properties>
    <myproperty>${propEnv}</myproperty>
</properties>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.