Come fare riferimento alla variabile d'ambiente in POM.xml?


172

Sto usando Maven come strumento di costruzione. Ho impostato una variabile di ambiente chiamata env. Come posso accedere al valore di questa variabile d'ambiente nel pom.xmlfile?


7
puoi riferirlo con $ {env.XXXXXXXX} dove XXXXXXXX è il nome della tua variabile. Ad esempio $ {env.PATH} fornirà il riferimento PATH.
Seshagiri,

2
Ma probabilmente non dovresti. Se rendi le tue build dipendenti dal tuo ambiente, è più difficile riprodurle.
Stephen C,

5
@StephenC Non direi "non dovrei", ma "stai molto attento". A volte un ambiente CI e un ambiente di sviluppo locale sembrano diversi e le variabili di ambiente sono un modo per colmare le lacune.
Andrew White,

1
Per me, IntelliJ 2019 mostra il ${env.XYZ}riferimento in rosso. La variabile viene espansa correttamente in fase di esecuzione ma viene visualizzata in rosso al momento della compilazione. Pertanto ho la stessa domanda che era stata inizialmente posta.
Djangofan,

1
Sì, lo fa @ MarkHan
Djangofan il

Risposte:


216

Consulta la Guida alle proprietà di Maven ...

Come ha sottolineato Seshagiri nei commenti, ${env.VARIABLE_NAME}farà quello che vuoi.

Aggiungerò un avvertimento e dirò che a pom.xmldovrebbe descrivere completamente il tuo progetto, quindi ti preghiamo di usare le variabili di ambiente con giudizio. Se rendi le tue build dipendenti dal tuo ambiente, è più difficile riprodurle


3
Inoltre, rende la tua build dipendente dalla piattaforma e dal sistema.
lhunath,

12
Attenzione: tutti i caratteri di nome_varia in pom devono essere in maiuscolo per essere indipendenti dalla piattaforma. Perché è valido solo in maiuscolo in esecuzione sul sistema operativo Windows. Ad esempio, $ {env.M2_HOME} è valido, $ {env.m2_home} non è valido, anche se è stata definita una variabile di ambiente denominata m2_home.
Jeff Liu,

Ho questo nelle proprietà dell'ambiente Windows (WL_HOME = c: \ apps \ Weblogic12 \ wlserver_12.1) ma in pom restituisce questo valore c: \ apps \ Weblogic12 \ wlserver (senza_12.1) qualsiasi idea in cui potrebbe essere scelto Maven questo da?
Anand Rockzz,

Mi sono appena reso conto che stavo definendo un <wl_home> $ {WL_HOME} </wl_home> correttamente e che usavo quello e in qualche modo si riferiva senza la versione se lo facevo.
Anand Rockzz,

Funziona bene in Windows per IDE e CLI. Per MacOS / Linux / Unix è un po 'complicato ottenere supporto da IDE, dove senza dubbio Terminal , funziona bene.
Md Shahed Hossain,

29

Potrebbe essere più sicuro passare direttamente le variabili d'ambiente alle proprietà del sistema maven. Ad esempio, supponiamo che su Linux si desideri accedere alla variabile di ambiente MY_VARIABLE. È possibile utilizzare una proprietà di sistema nel file pom.

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

Impostare il valore della proprietà sulla riga comandi maven:

mvn clean package -Dmy.variable=$MY_VARIABLE

4
perché è più sicuro?
weberjn,

Questo non funziona per me, il nuovo valore di my.variable fornito nella riga di comando non sostituisce mai il valore nel blocco <properties>. Qualche idea?
Daniel Scott,

Per me proprietà più sicure, o almeno meno misteriose, possono essere descritte in un file delle proprietà. Tuttavia, mi rendo conto che la mia soluzione si basa sul framework Spring, motivo per cui probabilmente non funziona per Daniel.
EricGreg,

è più sicuro perché se non si riesce a modificare il valore tramite riga di comando / ambiente, è comunque un POM valido e build, dal valore nelle proprietà.
foo

20

Inoltre, assicurati che la tua variabile di ambiente sia composta solo da LETTERE MAIUSCOLE .... Non so perché (la documentazione non dice nulla di esplicito al riguardo, almeno il link fornito da @Andrew White), ma se la variabile è una parola minuscola (es. env.dummy), la variabile è sempre stata vuota o nulla ...

stavo lottando con questo come un'ora, fino a quando ho deciso di provare un CASO SUPERIORE VARIABILE, e il problema è stato risolto.

OK Variabili Esempi:

  • MANICHINO
  • DUMMY_ONE
  • JBOSS_SERVER_PATH

( NOTA : stavo usando Maven v3.0.5)

Spero che questo possa aiutare qualcuno ....


5
Le variabili di ambiente in unix fanno distinzione tra maiuscole e minuscole e vengono tradizionalmente dati in maiuscolo in modo tale che quando si guardano le variabili impostate nella shell, è possibile distinguere facilmente quali sono impostate localmente sulla shell e quali sono visibili ai processi figlio. Le variabili di ambiente in Windows non sembrano distinguere tra maiuscole e minuscole, ma non l'ho verificato dalla documentazione, ma solo da un piccolo esperimento al prompt dei comandi.
legalizzare il

11

Non possiamo usare

<properties>
    <my.variable>${env.MY_VARIABLE}</my.variable>
</properties>

È implicito, al contrario di quando lo si passa con una -D che lo rende esplicito e sovrascrive il valore di proprietà predefinito, che potrebbe essere ancora utile per impostare un ambiente di configurazione zero (es
Dev

1
funziona? L'ho provato e non è, almeno non nel mio ambiente
user26270 il

3

Stavo lottando con la stessa cosa, eseguendo uno script di shell che impostava variabili, quindi volevo usare le variabili in common-pom. L'obiettivo era far sì che le variabili di ambiente sostituissero le stringhe nei miei file di progetto usando il plug-in com.google.code.maven-replacer.

Uso ${env.foo}o ${env.FOO}non ha funzionato per me. Maven non stava trovando la variabile. Ciò che ha funzionato è stato passare la variabile come parametro della riga di comando in Maven. Ecco la configurazione:

  1. Imposta la variabile nello script della shell. Se stai lanciando Maven in uno script secondario, assicurati che la variabile venga impostata, ad es. Utilizzando source ./maven_script.shper chiamarlo dallo script padre.

  2. In shared-pom, crea un parametro da riga di comando che acquisisca la variabile di ambiente:

<Plug-in>
  ...
  <> esecuzioni
    <> esecuzioni
    ...
      <Esecuzione>
      ...
        <Configuration>
          <param> $ {foo} </param> <! - Nota che questo è * non * $ {env.foo} ->
        </ Configuration>
  1. In com.google.code.maven-replacer-plugin, crea il valore di sostituzione ${foo}.

  2. Nel mio script shell che chiama maven, aggiungilo al comando: -Dfoo=$foo


0

Puoi usare il <properties>tag per definire una variabile personalizzata e un ${variable}modello per 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.