Pasando argumentos de línea de comando de Maven como propiedades en pom.xml

97

¿Es posible pasar argumentos desde la línea de comando a las propiedades en el pom.xmlarchivo? por ejemplo yo corromvn ... argument

y en pom.xml

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

Gracias por la ayuda.

hudi
fuente
No es directamente lo que está pidiendo, pero los perfiles de maven pueden ser útiles para esto
Sig
sí, sé sobre perfiles. Estoy usando maven-soapui-plugin donde en <projectFile> ... </projectFile> se define el nombre del proyecto. Tengo alrededor de 10 proyectos y no quiero un nuevo perfil para cada proyecto. Quiero usar el argumento para ejecutar mvn ... project1 para ejecutar project1 y mvn ... project2 para ejecutar project2
hudi

Respuestas:

130

Para su ejemplo de propiedad, haga:

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

Tenga en cuenta las citas alrededor de la definición de propiedad completa. Los necesitará si su propiedad tiene espacios.

Alexander Pogrebnyak
fuente
17
Tenga en cuenta también que si tiene una propiedad en el pom y en la línea de comandos, la línea de comandos tiene prioridad. Esto puede resultar útil para proporcionar valores predeterminados reemplazables.
dan carter
2
También podemos pasar múltiples argumentos como este, algo como:mvn clean install "-Dprop1=value1" "-Dprop2=value2"
Sumit
14

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

.....

En este ejemplo, cuando ejecuta el pom sin ningún argumento mvn clean install, se ejecutará el perfil predeterminado.

Cuando se ejecuta con mvn -Denv=win64 clean install

Se ejecutará el perfil win64.

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

Abhishek2k6
fuente
Desde el uso de qué perfil, ¿debería ser mvn clean -Pwin64?
sendon1982
14

Usé el complemento de propiedades para resolver esto.

Las propiedades se definen en el pom y se escriben en un archivo my.properties, donde luego se puede acceder a ellas desde su código Java.

En mi caso, es el código de prueba el que necesita acceder a este archivo de propiedades, por lo que en el pom el archivo de propiedades se escribe en el testOutputDirectory de maven:

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

Utilice outputDirectory si desea que el código de su aplicación pueda acceder a las propiedades:

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

Para aquellos que buscan un ejemplo más completo (me tomó un poco de trabajo hacer que esto funcionara ya que no entendía cómo el nombre de las etiquetas de propiedades afecta la capacidad de recuperarlas en otra parte del archivo pom), mi pom se ve de la siguiente manera:

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

Y en la línea de comando:

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

Entonces se puede acceder a estas propiedades desde el código 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");
Menear
fuente
Mi archivo de propiedad en java está dando el mismo valor que $ {app.env}, no lo está seleccionando de la línea de comandos de maven, ¿el nombre de la propiedad debe ser igual a un valor como este? <app.env> $ {app.env} </ app.env>
Sujith
6

Puede dar nombres de variables como archivos de proyecto. Por ejemplo, en la configuración de su complemento, proporcione solo una etiqueta como se muestra a continuación:

<projectFile>${projectName}</projectFile>

Luego, en la línea de comando, puede pasar el nombre del proyecto como parámetro: -

mvn [your-command] -DprojectName=[name of project]
Hariom Tomar
fuente
Quiero proporcionar el nombre y el entorno del navegador en el comando mvn. Si no proporciono, elegirá predeterminado. ¿Como hacer eso?
paul
1
mvn clean package -DpropEnv=PROD

Luego usando así en POM.xml

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