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.

hudi
la source
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.

Alexander Pogrebnyak
la source
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

Abhishek2k6
la source
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");
Remuer
la source
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]
Hariom Tomar
la source
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>
sendon1982
la source