¿Cómo referir la variable de entorno en POM.xml?

172

Estoy usando maven como herramienta de construcción. He establecido una variable de entorno llamada env. ¿Cómo puedo obtener acceso al valor de esta variable de entorno en el pom.xmlarchivo?

usuario1016403
fuente
77
puede referirlo con $ {env.XXXXXXXX} donde XXXXXXXX es su nombre de variable. Por ejemplo, $ {env.PATH} dará referencia a PATH.
Seshagiri
2
Pero probablemente no deberías. Si hace que sus compilaciones dependan de su entorno, son más difíciles de reproducir.
Stephen C
55
@StephenC No diría "no debería", pero "ten mucho cuidado". A veces, un entorno de CI y un entorno de desarrollo local se ven diferentes y las variables de entorno son una forma de llenar los vacíos.
Andrew White
1
Para mí, IntelliJ 2019 muestra la ${env.XYZ}referencia en rojo. La variable se expande correctamente en tiempo de ejecución pero se muestra en rojo en tiempo de compilación. Por lo tanto, tengo la misma pregunta que se hizo originalmente.
djangofan
1
Sí, lo hace @MarkHan
djangofan

Respuestas:

216

Consulte la Guía de propiedades de Maven ...

Como Seshagiri señaló en los comentarios, ${env.VARIABLE_NAME}hará lo que quiera.

Agregaré una palabra de advertencia y diré que pom.xmldebería describir completamente su proyecto, así que utilice las variables de entorno con prudencia. Si hace que sus compilaciones dependan de su entorno, son más difíciles de reproducir

Andrew White
fuente
3
Además, hace que su compilación dependa de la plataforma y el sistema.
lhunath
12
Tenga cuidado: todos los caracteres de variable_name en su pom deben estar en mayúsculas para ser independientes de la plataforma. Porque solo es válido en mayúsculas en el sistema operativo Windows. Por ejemplo, $ {env.M2_HOME} es válido, $ {env.m2_home} no es válido, incluso si definió una variable de entorno llamada m2_home.
Jeff Liu el
Tengo esto en las propiedades del entorno de Windows (WL_HOME = c: \ apps \ Weblogic12 \ wlserver_12.1) pero en pom, devuelve este valor c: \ apps \ Weblogic12 \ wlserver (sin_12.1) cualquier idea de dónde más podría estar eligiendo Maven esto de?
Anand Rockzz
Me acabo de dar cuenta de que estaba definiendo correctamente un <wl_home> $ {WL_HOME} </wl_home> y lo estaba usando y de alguna manera se refería sin la versión si lo hacía.
Anand Rockzz
Funciona bien en Windows para IDE y CLI. Para MacOS / Linux / Unix es un poco complicado obtener soporte de IDE donde, sin duda, para Terminal , está funcionando bien.
Md Shahed Hossain
29

Puede ser más seguro pasar directamente las variables de entorno a las propiedades del sistema maven. Por ejemplo, supongamos que en Linux desea acceder a la variable de entorno MY_VARIABLE. Puede usar una propiedad del sistema en su archivo pom.

<properties>
    ...
    <!-- Default value for my.variable can be defined here -->
    <my.variable>foo</my.variable>
    ...
</properties>
...
<!-- Use my.variable -->
... ${my.variable} ...

Establezca el valor de la propiedad en la línea de comando maven:

mvn clean package -Dmy.variable=$MY_VARIABLE
EricGreg
fuente
44
¿Por qué es esto más seguro?
weberjn
Esto no funciona para mí, el nuevo valor de my.variable proporcionado en la línea de comando nunca anula el valor en el bloque <properties>. ¿Algunas ideas?
Daniel Scott
Para mí, más seguro, o al menos menos misterioso, las propiedades b / c se pueden describir en un archivo de propiedades. Sin embargo, me doy cuenta de que mi solución se basa en el marco de Spring, por lo que probablemente no funcione para Daniel.
EricGreg
es más seguro porque si no puede cambiar el valor a través de la línea de comandos / entorno, sigue siendo un POM y una compilación válidos, a partir del valor en las propiedades.
foo
20

Además, asegúrese de que su variable de entorno esté compuesta solo por LETRAS MAYÚSCULAS ... No sé por qué (la documentación no dice nada explícito al respecto, al menos el enlace proporcionado por @Andrew White), pero si la variable es una palabra en minúscula (por ejemplo, env.dummy), la variable siempre vino vacía o nula ...

Estaba luchando con esto como una hora, hasta que decidí probar una VARIABLE DE CASO SUPERIOR, y el problema se resolvió.

OK Variables Ejemplos:

  • TONTO
  • DUMMY_ONE
  • JBOSS_SERVER_PATH

( NOTA : Estaba usando maven v3.0.5)

Espero que esto pueda ayudar a alguien ...

La manera de Carlitos
fuente
55
Las variables de entorno en Unix distinguen entre mayúsculas y minúsculas y tradicionalmente reciben nombres en mayúsculas para que cuando observe las variables establecidas en su shell, pueda distinguir fácilmente cuáles están configuradas localmente en su shell y cuáles son visibles para los procesos secundarios. Las variables de entorno en Windows no parecen distinguir entre mayúsculas y minúsculas, pero no lo he verificado a partir de la documentación, solo de un pequeño experimento en el símbolo del sistema.
legalizar
11

No podemos usar

<properties>
    <my.variable>${env.MY_VARIABLE}</my.variable>
</properties>
tmjee
fuente
Es implícito, a diferencia de cuando lo pasa con un -D que lo hace explícito y anula el valor de propiedad predeterminado, que aún podría ser útil para configurar un entorno de configuración cero (por ejemplo, dev)
Technoshaft
1
¿Esto funciona? Lo he intentado y no lo es, al menos no en mi entorno
user26270
3

Estaba luchando con lo mismo, ejecutando un script de shell que establece variables, y luego quería usar las variables en el pom compartido. El objetivo era que las variables de entorno reemplazaran las cadenas en los archivos de mi proyecto usando com.google.code.maven-replacecer-plugin.

Usar ${env.foo}o ${env.FOO}no funcionó para mí. Maven simplemente no estaba encontrando la variable. Lo que funcionó fue pasar la variable como un parámetro de línea de comandos en Maven. Aquí está la configuración:

  1. Establezca la variable en el script de shell. Si está iniciando Maven en un subguión, asegúrese de que la variable se esté configurando, por ejemplo, source ./maven_script.shpara llamarla desde el guión principal.

  2. En shared-pom, cree un parámetro de línea de comandos que tome la variable de entorno:

<plugin>
  ...
  <ejecuciones>
    <ejecuciones>
    ...
      <ejecución>
      ...
        <configuración>
          <param> $ {foo} </param> <! - Tenga en cuenta que esto es * no * $ {env.foo} ->
        </configuration>
  1. En com.google.code.maven-replacer-plugin, realice el valor de reemplazo ${foo}.

  2. En mi script de shell que llama a maven, agregue esto al comando: -Dfoo=$foo

fjones
fuente
0

Puede usar la <properties>etiqueta para definir una variable personalizada y un ${variable}patrón para usarla

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <!-- define -->
    <properties>
        <property.name>1.0</property.name>
    </properties>

    <!-- using -->
    <version>${property.name}</version>

</project>
yoAlex5
fuente