Jak odwołać się do zmiennej środowiskowej w POM.xml?

172

Używam Mavena jako narzędzia do budowania. Ustawiłem zmienną środowiskową o nazwie env. Jak mogę uzyskać dostęp do wartości tej zmiennej środowiskowej w pom.xmlpliku?

user1016403
źródło
7
możesz skierować go za pomocą $ {env.XXXXXXXX}, gdzie XXXXXXXX to nazwa Twojej zmiennej. Na przykład $ {env.PATH} poda odniesienie PATH.
Seshagiri
2
Ale prawdopodobnie nie powinieneś. Jeśli uzależnisz swoje kompilacje od środowiska, trudniej będzie je odtworzyć.
Stephen C
5
@StephenC Nie powiedziałbym „nie powinien”, ale „bądź bardzo ostrożny”. Czasami środowisko CI i lokalne środowisko deweloperskie wyglądają inaczej, a zmienne środowiskowe są sposobem na wypełnienie luk.
Andrew White
1
Dla mnie IntelliJ 2019 pokazuje ${env.XYZ}odniesienie jako czerwone. Zmienna jest poprawnie rozwijana w czasie wykonywania, ale w czasie kompilacji jest wyświetlana na czerwono. Dlatego mam to samo pytanie, które zostało zadane pierwotnie.
djangofan
1
Tak, robi @MarkHan
djangofan

Odpowiedzi:

216

Sprawdź przewodnik po właściwościach Mavena ...

Jak Seshagiri zauważył w komentarzach, ${env.VARIABLE_NAME}zrobi, co chcesz.

Dodam słowo ostrzeżenia i powiem, że a pom.xmlpowinno całkowicie opisać twój projekt, więc proszę, rozważ rozsądnie używać zmiennych środowiskowych. Jeśli uzależnisz swoje kompilacje od środowiska, trudniej będzie je odtworzyć

Andrew White
źródło
3
Ponadto uzależnia twoją kompilację od platformy i systemu.
lhunath
12
Uwaga: wszystkie znaki nazwa_zmiennej w twoim pom muszą być duże, aby były niezależne od platformy. Ponieważ jest ważne tylko w postaci wielkich liter w systemie operacyjnym Windows. Na przykład, $ {env.M2_HOME} jest poprawne, $ {env.m2_home} jest nieprawidłowe, nawet jeśli zdefiniowano zmienną środowiskową o nazwie m2_home.
Jeff Liu
Mam to we właściwościach środowiska Windows (WL_HOME = c: \ apps \ Weblogic12 \ wlserver_12.1), ale w pom zwraca tę wartość c: \ apps \ Weblogic12 \ wlserver (bez_12.1) każdy pomysł, gdzie jeszcze może wybierać maven to się od?
Anand Rockzz
Właśnie zdałem sobie sprawę, że definiowałem poprawnie nazwaną <wl_home> $ {WL_HOME} </wl_home> i używam tego i jakoś odnosiło się to bez wersji, jeśli to zrobię.
Anand Rockzz
Działa dobrze w systemie Windows dla IDE i CLI. W przypadku systemów MacOS / Linux / Unix uzyskanie wsparcia od IDE jest trochę trudne, gdzie bez wątpienia w przypadku terminala działa dobrze.
Md Shahed Hossain
29

Bezpieczniejsze może być bezpośrednie przekazywanie zmiennych środowiskowych do właściwości systemu maven. Na przykład, powiedzmy w Linuksie, że chcesz uzyskać dostęp do zmiennej środowiskowej MY_VARIABLE. Możesz użyć właściwości systemowej w pliku pom.

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

Ustaw wartość właściwości w wierszu poleceń maven:

mvn clean package -Dmy.variable=$MY_VARIABLE
EricGreg
źródło
4
dlaczego to jest bezpieczniejsze?
weberjn
To nie działa dla mnie, nowa wartość my.variable podana w wierszu poleceń nigdy nie zastępuje wartości w bloku <properties>. Jakieś pomysły?
Daniel Scott,
Dla mnie bezpieczniejsze lub przynajmniej mniej tajemnicze właściwości b / c można opisać w pliku właściwości. Jednak zdaję sobie sprawę, że moje rozwiązanie opiera się na frameworku Spring, przez co prawdopodobnie nie działa w przypadku Daniela.
EricGreg
jest bezpieczniejsze, ponieważ jeśli nie zmienisz wartości za pomocą wiersza poleceń / środowiska, nadal jest to poprawny POM i kompilacja, z wartości we właściwościach.
foo
20

Ponadto, upewnij się, że zmienna jest składają się wyłącznie wielkimi literami .... Nie wiem dlaczego (dokumentacja nie mówi nic o tym wyraźnie, przynajmniej łącza przez @Andrew biały), ale jeśli zmienna jest słowem składającym się z małych liter (np. env.dummy), zmienna zawsze była pusta lub zerowa ...

Zmagałem się z tym przez około godzinę, dopóki nie zdecydowałem się wypróbować ZMIENNEJ WIELKICH LITER i problem został rozwiązany.

Przykłady zmiennych OK:

  • MANEKIN
  • DUMMY_ONE
  • JBOSS_SERVER_PATH

( UWAGA : używałem maven v3.0.5)

Mam nadzieję, że to może komuś pomóc ....

Carlitos Way
źródło
5
Zmienne środowiskowe w systemie UNIX są wrażliwe na wielkość liter i tradycyjnie są nadawane imionami wielkimi literami, tak że patrząc na zmienne ustawione w powłoce można łatwo rozróżnić, które są ustawione lokalnie w powłoce, a które są widoczne dla procesów potomnych. Zmienne środowiskowe w systemie Windows nie wydają się uwzględniać wielkości liter, ale nie zweryfikowałem tego na podstawie dokumentacji, tylko z małego eksperymentu w wierszu polecenia.
zalegalizować
11

Nie możemy użyć

<properties>
    <my.variable>${env.MY_VARIABLE}</my.variable>
</properties>
tmjee
źródło
Jego niejawne, w przeciwieństwie do sytuacji, gdy przekazujesz ją z -D, która czyni ją jawną i przesłania domyślną wartość właściwości, co może być nadal przydatne do ustawienia zerowego środowiska konfiguracji (np. Dev)
Technoshaft
1
czy to działa? Wypróbowałem to i nie jest, przynajmniej nie w moim środowisku
user26270,
3

Zmagałem się z tym samym, uruchamiając skrypt powłoki, który ustawiał zmienne, a następnie chciałem użyć zmiennych w shared-pom. Celem było, aby zmienne środowiskowe zastępowały ciągi znaków w plikach projektu za pomocą wtyczki com.google.code.maven-replaceer-plugin.

Używanie ${env.foo}lub ${env.FOO}nie działało dla mnie. Maven po prostu nie znalazł zmiennej. Udało się przekazać zmienną jako parametr wiersza poleceń w Maven. Oto konfiguracja:

  1. Ustaw zmienną w skrypcie powłoki. Jeśli uruchamiasz Mavena w skrypcie podrzędnym, upewnij się, że zmienna jest ustawiana, np. Używając source ./maven_script.shdo wywołania jej ze skryptu nadrzędnego.

  2. W shared-pom utwórz parametr wiersza polecenia, który pobiera zmienną środowiskową:

<plugin>
  ...
  <wykonania>
    <wykonania>
    ...
      <wykonanie>
      ...
        <konfiguracja>
          <param> $ {foo} </param> <! - Zauważ, że to * nie * $ {env.foo} ->
        </configuration>
  1. W com.google.code.maven-replaceer-plugin wprowadź wartość zastępczą ${foo}.

  2. W moim skrypcie powłoki, który wywołuje maven, dodaj to do polecenia: -Dfoo=$foo

fjones
źródło
0

Możesz użyć <properties>tagu, aby zdefiniować niestandardową zmienną i ${variable}wzorzec, który ma z niej korzystać

<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
źródło