Wie verweise ich auf Umgebungsvariablen in POM.xml?

172

Ich benutze Maven als Build-Tool. Ich habe eine Umgebungsvariable namens gesetzt env. Wie kann ich auf den Wert dieser Umgebungsvariablen in der pom.xmlDatei zugreifen ?

user1016403
quelle
7
Sie können es mit $ {env.XXXXXXXX} referenzieren, wobei XXXXXXXX Ihr Variablenname ist. Zum Beispiel gibt $ {env.PATH} eine PATH-Referenz.
Seshagiri
2
Aber du solltest es wahrscheinlich nicht. Wenn Sie Ihre Builds von Ihrer Umgebung abhängig machen, sind sie schwerer zu reproduzieren.
Stephen C
5
@StephenC Ich würde nicht sagen "sollte nicht", aber "sei sehr vorsichtig". Manchmal sehen eine CI-Umgebung und eine lokale Entwicklungsumgebung unterschiedlich aus, und Umgebungsvariablen sind eine Möglichkeit, die Lücken zu schließen.
Andrew White
1
Für mich zeigt IntelliJ 2019 die ${env.XYZ}Referenz als rot. Die Variable wird zur Laufzeit korrekt erweitert, zur Kompilierungszeit jedoch rot angezeigt. Ich habe daher die gleiche Frage, die ursprünglich gestellt wurde.
Djangofan
1
Ja, es tut @MarkHan
Djangofan

Antworten:

216

Lesen Sie den Maven Properties Guide ...

Wie Seshagiri in den Kommentaren betonte, ${env.VARIABLE_NAME}wird er tun, was Sie wollen.

Ich werde ein Wort der Warnung hinzufügen und sagen, dass a pom.xmlIhr Projekt vollständig beschreiben sollte. Verwenden Sie daher Umgebungsvariablen mit Bedacht. Wenn Sie Ihre Builds von Ihrer Umgebung abhängig machen, sind sie schwerer zu reproduzieren

Andrew White
quelle
3
Außerdem ist Ihr Build plattform- und systemabhängig.
lhunath
12
Vorsichtshinweise: Alle Zeichen von Variablenname in Ihrem POM müssen in Großbuchstaben geschrieben sein, um plattformunabhängig zu sein. Weil es nur in Großbuchstaben unter Windows gültig ist. Beispiel: $ {env.M2_HOME} ist gültig, $ {env.m2_home} ist ungültig, selbst wenn Sie eine Umgebungsvariable mit dem Namen m2_home definiert haben.
Jeff Liu
Ich habe dies in den Windows-Umgebungseigenschaften (WL_HOME = c: \ apps \ Weblogic12 \ wlserver_12.1), aber in pom gibt es diesen Wert c: \ apps \ Weblogic12 \ wlserver (ohne_12.1) zurück, jede Idee, wo sonst Maven auswählen könnte das ab?
Anand Rockzz
Ich habe gerade festgestellt, dass ich ein richtig genanntes <wl_home> $ {WL_HOME} </ wl_home> definiert und dieses verwendet habe und es irgendwie ohne die Version referenziert hat, wenn ich das tue.
Anand Rockzz
Es funktioniert gut in Windows für IDE & CLI. Für MacOS / Linux / Unix ist es etwas schwierig, Unterstützung von IDE zu erhalten, wo es ohne Zweifel für Terminal gut funktioniert.
Md Shahed Hossain
29

Es ist möglicherweise sicherer, Umgebungsvariablen direkt an Maven-Systemeigenschaften zu übergeben. Angenommen, Sie möchten unter Linux auf die Umgebungsvariable MY_VARIABLE zugreifen. Sie können eine Systemeigenschaft in Ihrer POM-Datei verwenden.

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

Legen Sie den Eigenschaftswert in der Maven-Befehlszeile fest:

mvn clean package -Dmy.variable=$MY_VARIABLE
EricGreg
quelle
4
Warum ist das sicherer?
Weberjn
Dies funktioniert bei mir nicht. Der neue Wert von my.variable in der Befehlszeile überschreibt niemals den Wert im Block <properties>. Irgendwelche Ideen?
Daniel Scott
Für mich können sicherere oder zumindest weniger mysteriöse b / c-Eigenschaften in einer Eigenschaftendatei beschrieben werden. Mir ist jedoch klar, dass meine Lösung auf dem Spring-Framework basiert, weshalb es für Daniel wahrscheinlich nicht funktioniert.
EricGreg
Es ist sicherer, denn wenn Sie den Wert nicht über die Befehlszeile / Umgebung ändern können, handelt es sich immer noch um ein gültiges POM und Build, basierend auf dem Wert in den Eigenschaften.
foo
20

Stellen Sie außerdem sicher , dass Ihr Umgebungsvariable ist nur durch Versalienzeichen zusammengesetzt .... Ich weiß nicht , warum (die Dokumentation nicht nichts sagt ausdrücklich darüber, zumindest die Verbindung zur Verfügung gestellt von @ Andrew weiß), aber wenn Die Variable ist ein Kleinbuchstaben (z. B. env.dummy). Die Variable war immer leer oder null.

Ich hatte ungefähr eine Stunde damit zu kämpfen, bis ich mich entschied, einen UPPER CASE VARIABLE auszuprobieren, und das Problem gelöst war.

OK Variablen Beispiele:

  • DUMMY
  • DUMMY_ONE
  • JBOSS_SERVER_PATH

( HINWEIS : Ich habe maven v3.0.5 verwendet.)

Ich hoffe, dass dies jemandem helfen kann ....

Carlito's Weg
quelle
5
Umgebungsvariablen in Unix unterscheiden zwischen Groß- und Kleinschreibung und erhalten traditionell Großbuchstaben, sodass Sie beim Betrachten der in Ihrer Shell festgelegten Variablen leicht unterscheiden können, welche lokal in Ihrer Shell festgelegt und welche für untergeordnete Prozesse sichtbar sind. Umgebungsvariablen in Windows scheinen nicht zwischen Groß- und Kleinschreibung zu unterscheiden, aber ich habe dies nicht anhand der Dokumentation überprüft, sondern nur anhand eines kleinen Experiments an der Eingabeaufforderung.
Legalisieren Sie den
11

Können wir nicht verwenden

<properties>
    <my.variable>${env.MY_VARIABLE}</my.variable>
</properties>
tmjee
quelle
Es ist implizit, im Gegensatz dazu, wenn Sie es mit einem -D übergeben, das es explizit macht und den Standardeigenschaftswert überschreibt, was immer noch nützlich sein kann, um eine Null-Konfigurationsumgebung (z. B. dev)
einzurichten
1
Funktioniert das? Ich habe es versucht und es ist nicht, zumindest nicht in meiner Umgebung
user26270
3

Ich hatte mit der gleichen Sache zu kämpfen, indem ich ein Shell-Skript ausführte, das Variablen setzte, und dann die Variablen im Shared-Pom verwenden wollte. Das Ziel war, dass Umgebungsvariablen Zeichenfolgen in meinen Projektdateien mithilfe des com.google.code.maven-replaceer-Plugins ersetzen.

Verwenden ${env.foo}oder ${env.FOO}nicht für mich gearbeitet. Maven fand die Variable einfach nicht. Was funktionierte, war die Übergabe der Variablen als Befehlszeilenparameter in Maven. Hier ist das Setup:

  1. Legen Sie die Variable im Shell-Skript fest. Wenn Sie Maven in einem Unterskript starten, stellen Sie sicher, dass die Variable festgelegt wird, z. B. source ./maven_script.shum sie über das übergeordnete Skript aufzurufen.

  2. Erstellen Sie in shared-pom einen Befehlszeilenparameter, der die Umgebungsvariable erfasst:

<plugin>
  ...
  <Ausführungen>
    <Ausführungen>
    ...
      <Ausführung>
      ...
        <Konfiguration>
          <param> $ {foo} </ param> <! - Beachten Sie, dass dies * nicht * $ {env.foo} -> ist
        </ configuration>
  1. Geben Sie im com.google.code.maven-replaceer-Plugin den Ersatzwert ein ${foo}.

  2. Fügen Sie in meinem Shell-Skript, das maven aufruft, dies dem Befehl hinzu: -Dfoo=$foo

fjones
quelle
0

Mit dem <properties>Tag können Sie eine benutzerdefinierte Variable und ein ${variable}Muster definieren, um sie zu verwenden

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