Variable de entorno con Maven

86

He portado un proyecto de Eclipse a Maven y necesito establecer una variable de entorno para que mi proyecto funcione.

En Eclipse, voy a "Ejecutar -> Ejecutar configuraciones" y, en la pestaña "entorno", establezco "WSNSHELL_HOME" en el valor "conf".

¿Cómo puedo hacer esto con Maven?

¡Muchas gracias!

Gianluca
fuente
Sugeriría que su proyecto se ejecute sin la variable de entorno. Y luego pasar a maven.
khmarbaise
3
No hay razón para omitir el uso de variables de entorno si es útil para su sistema y estoy bastante seguro de que mi solución funciona (yo mismo la uso). Vea mi sugerencia refarding 'System.getenv' / 'System.getProperty'.
Viernes

Respuestas:

120

Puede simplemente pasarlo en la línea de comando, como

mvn -DmyVariable=someValue install

[Actualización] Tenga en cuenta que el orden de los parámetros es importante: debe especificar cualquier opción antes de los comandos. [/Actualizar]

Dentro del archivo POM, puede referirse a las variables del sistema (especificadas en la línea de comando o en el pom) como ${myVariable}, y las variables de entorno como ${env.myVariable}. (Gracias a los comentaristas por la corrección).

Actualización2

Bien, entonces desea pasar su variable de sistema a sus pruebas. Si, como supongo, usa el complemento Surefire para realizar pruebas, lo mejor es especificar las variables del sistema necesarias dentro del pom, en su pluginssección, por ejemplo

<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            ...
            <configuration>
                ...
                <systemPropertyVariables>
                    <WSNSHELL_HOME>conf</WSNSHELL_HOME>
                </systemPropertyVariables>
            </configuration>
        </plugin>
        ...
    </plugins>
</build>
Péter Török
fuente
Necesito iniciar 'mvn test', no parece funcionar, porque si escribo mvn test -DWSNSHELL_HOME = conf, sigo recibiendo la excepción java.io.FileNotFoundException: null / wsnshell.conf (No existe tal archivo o directorio)
Gianluca
2
@Janky, pruébalo al revés, es decir mvn -DWSNSHELL_HOME=conf test.
Péter Török
no ... :( Todavía obtengo java.io.FileNotFoundException: null / wsnshell.conf (No existe tal archivo o directorio) ... en el código leí la variable de esta manera ... ¿ System.getenv("WSNSHELL_HOME");es correcta?
Gianluca
@Janky, espera un minuto, ¿ejecutas la aplicación directamente desde la compilación de Maven o ...?
Péter Török
43
Ustedes dos están confundiendo las variables de entorno con las propiedades del sistema. La opción de comando -D establece solo Propiedades del sistema.
Wouter Lievens
25

Las -Dpropiedades no serán propagadas de manera confiable desde el seguro infalible hasta su prueba (no sé por qué funciona con eclipse). Cuando use maven en la línea de comando, use la propiedad argLine para envolver su propiedad. Esto los pasará a tu prueba.

mvn -DargLine="-DWSNSHELL_HOME=conf" test

Use System.getPropertypara leer el valor en su código. Eche un vistazo a esta publicación sobre la diferencia de System.getenvy Sytem.getProperty.

FrVaBe
fuente
2
Debería leer la propiedad con System.getProperty ("WSNSHELL_HOME") en lugar de usar System.getenv.
Viernes
Perfecto, después de pasar MUCHO tiempo probando otras cosas, esta funcionó para mí.
Bhushan
Si ha configurado los parámetros argLine para el complemento seguro en su pom.xml, agregue el ${argLine}marcador de posición; de lo contrario, los parámetros de la línea de comando no se recogerán. Ejemplo:<argLine>-Duser.timezone=UTC ${argLine}</argLine>
sorrymissjackson
Esto funcionó para mí, ¡gracias! Qué herramienta tan genial para configurar sys-props para pruebas maven. Aún a primera vista, es muy confuso por qué no puede usarlos directamente, pero requiere un argumento adicional.
phi
9

Puede envolver su comando maven en un script bash:

#!/bin/bash

export YOUR_VAR=thevalue
mvn test
unset YOUR_VAR
modle13
fuente
Increíblemente, este es el único método que funcionó completamente para mí usando el complemento Surefire. De las 10 o más variables env que configuré en el POM, dos de ellas no se ven cuando se ejecuta la prueba. Incluso si los coloco en el caparazón y luego mvn install, todavía están ocultos de alguna manera. Sin embargo, si ejecuto desde un script de shell, ¡funciona bien! Ojalá entendiera por qué sucede esto.
Pete
Creo que esta debería ser una respuesta aceptada ya que esta es la solución más simple
wtsiamruk
5

Para la variable de entorno en Maven, puede establecer a continuación.

http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#environmentVariables http://maven.apache.org/surefire/maven-failsafe-plugin/integration-test-mojo.html #Variables de entorno

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    ...
    <configuration>
        <includes>
            ...
        </includes>
        <environmentVariables>
            <WSNSHELL_HOME>conf</WSNSHELL_HOME>
        </environmentVariables>
    </configuration>
</plugin>
Kevin
fuente
4

Hay un complemento de maven llamado properties-maven-plugin que proporciona un objetivo set-system-propertiespara establecer variables del sistema. Esto es especialmente útil si tiene un archivo que contiene todas estas propiedades. Por lo tanto, puede leer un archivo de propiedades y establecerlo como variable de sistema.

cristiano
fuente
1

en su código agregue:

System.getProperty("WSNSHELL_HOME")

Modifique o agregue valor a la propiedad del comando maven:

mvn clean test -DargLine=-DWSNSHELL_HOME=yourvalue

Si desea ejecutarlo en Eclipse, agregue argumentos de VM en sus configuraciones de depuración / ejecución

  • Vaya a Ejecutar -> Ejecutar configuraciones
  • Seleccionar argumentos de pestaña
  • Agregar en la sección Argumentos de VM

-DWSNSHELL_HOME = suvalor

Ver ejemplo de imagen

no es necesario modificar el POM

Luis Eduardo Blandon Puello
fuente
0

Siguiendo la documentación de la respuesta de @ Kevin, la siguiente me funcionó para configurar la variable de entorno con el complemento seguro de maven

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
    <environmentVariables>
        <WSNSHELL_HOME>conf</WSNSHELL_HOME>
    </environmentVariables>
</configuration>
Yuvaraj G
fuente
0

Puede pasar algunos de los argumentos a través de la _JAVA_OPTIONSvariable.

Por ejemplo, defina una variable para los indicadores de proxy de maven como esta:

_JAVA_OPTIONS="-Dhttp.proxyHost=$http_proxy_host -Dhttp.proxyPort=$http_proxy_port -Dhttps.proxyHost=$https_proxy_host -Dhttps.proxyPort=$http_proxy_port"

Y luego use mvn clean install(se activará automáticamente _JAVA_OPTIONS).

Davis Benny
fuente