Comment référencer la variable d'environnement dans POM.xml?

172

J'utilise maven comme outil de construction. J'ai défini une variable d'environnement appelée env. Comment puis-je accéder à la valeur de cette variable d'environnement dans le pom.xmlfichier?

utilisateur1016403
la source
7
vous pouvez le faire référence avec $ {env.XXXXXXXX} où XXXXXXXX est votre nom de variable. Par exemple $ {env.PATH} donnera la référence PATH.
Seshagiri
2
Mais vous ne devriez probablement pas. Si vous rendez vos builds dépendants de votre environnement, ils sont plus difficiles à reproduire.
Stephen C
5
@StephenC Je ne dirais pas "ne devrait pas", mais "soyez très prudent". Parfois, un environnement CI et un environnement de développement local sont différents et les variables d'environnement sont un moyen de combler les lacunes.
Andrew White
1
Pour moi, IntelliJ 2019 affiche la ${env.XYZ}référence en rouge. La variable est correctement développée au moment de l'exécution, mais s'affiche en rouge au moment de la compilation. J'ai donc la même question qui a été posée à l'origine.
djangofan le
1
Oui, c'est le cas @MarkHan
djangofan

Réponses:

216

Consultez le guide des propriétés Maven ...

Comme Seshagiri l'a souligné dans les commentaires, ${env.VARIABLE_NAME}fera ce que vous voulez.

Je vais ajouter un mot d'avertissement et dire que cela pom.xmldevrait décrire complètement votre projet, veuillez donc utiliser judicieusement les variables d'environnement. Si vous rendez vos builds dépendants de votre environnement, ils sont plus difficiles à reproduire

Andrew White
la source
3
En outre, cela rend votre plate-forme de construction et votre système dépendants.
lhunath
12
Attention: tous les caractères de nom_variable dans votre pom doivent être en majuscules pour être indépendants de la plateforme. Parce qu'il n'est valide qu'en majuscules sous Windows OS. Par exemple, $ {env.M2_HOME} est valide, $ {env.m2_home} n'est pas valide, même si vous avez défini une variable d'environnement nommée m2_home.
Jeff Liu
J'ai ceci dans les propriétés de l'environnement Windows (WL_HOME = c: \ apps \ Weblogic12 \ wlserver_12.1) mais dans pom, il renvoie cette valeur c: \ apps \ Weblogic12 \ wlserver (sans_12.1) toute idée où maven pourrait choisir cela à partir de?
Anand Rockzz
Je viens de réaliser que je définissais un <wl_home> $ {WL_HOME} </wl_home> correctement appelé et que je l'utilisais et en quelque sorte, il faisait référence sans la version si je le fais.
Anand Rockzz
Cela fonctionne bien dans Windows pour IDE et CLI. Pour MacOS / Linux / Unix, il est un peu difficile d'obtenir le support de l'EDI où aucun doute pour Terminal , cela fonctionne bien.
Md Shahed Hossain
29

Il peut être plus sûr de passer directement les variables d'environnement aux propriétés système maven. Par exemple, disons sous Linux que vous souhaitez accéder à la variable d'environnement MY_VARIABLE. Vous pouvez utiliser une propriété système dans votre fichier pom.

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

Définissez la valeur de la propriété sur la ligne de commande maven:

mvn clean package -Dmy.variable=$MY_VARIABLE
EricGreg
la source
4
pourquoi est-ce plus sûr?
weberjn
Cela ne fonctionne pas pour moi, la nouvelle valeur de my.variable fournie sur la ligne de commande ne remplace jamais la valeur du bloc <properties>. Des idées?
Daniel Scott
Pour moi, les propriétés b / c plus sûres, ou du moins moins mystérieuses, peuvent être décrites dans un fichier de propriétés. Cependant, je réalise que ma solution repose sur le framework Spring, ce qui explique probablement pourquoi cela ne fonctionne pas pour Daniel.
EricGreg
c'est plus sûr car si vous ne parvenez pas à modifier la valeur via la ligne de commande / l'environnement, il s'agit toujours d'un POM valide et d'une construction, à partir de la valeur dans les propriétés.
foo le
20

Assurez-vous également que votre variable d'environnement est composée uniquement de LETTRES MAJUSCULES ... Je ne sais pas pourquoi (la documentation ne dit rien d'explicite à ce sujet, au moins le lien fourni par @Andrew White), mais si la variable est un mot minuscule (par exemple env.dummy), la variable est toujours venue vide ou nulle ...

J'avais du mal avec ça pendant une heure, jusqu'à ce que je décide d'essayer une VARIABLE DE CAS SUPÉRIEUR, et le problème est résolu.

Exemples de variables OK:

  • MANNEQUIN
  • DUMMY_ONE
  • JBOSS_SERVER_PATH

( REMARQUE : j'utilisais maven v3.0.5)

J'espère que cela peut aider quelqu'un ...

Voie Carlitos
la source
5
Les variables d'environnement sous unix sont sensibles à la casse et sont traditionnellement données en majuscules, de sorte que lorsque vous regardez les variables définies dans votre shell, vous pouvez facilement distinguer celles qui sont définies localement dans votre shell et celles qui sont visibles pour les processus enfants. Les variables d'environnement dans Windows ne semblent pas être sensibles à la casse, mais je ne l'ai pas vérifié à partir de la documentation, uniquement à partir d'une petite expérience à l'invite de commande.
légaliser
11

Ne pouvons-nous pas utiliser

<properties>
    <my.variable>${env.MY_VARIABLE}</my.variable>
</properties>
tmjee
la source
C'est implicite, par opposition à lorsque vous le passez avec un -D qui le rend explicite et remplace la valeur de propriété par défaut, ce qui pourrait être encore utile pour configurer un environnement de configuration zéro (par exemple, dev)
Technoshaft
1
Est-ce que ça marche? Je l'ai essayé et ce n'est pas le cas, du moins pas dans mon environnement
user26270
3

J'avais du mal avec la même chose, exécutant un script shell qui définissait des variables, puis voulant utiliser les variables dans le shared-pom. L'objectif était de faire en sorte que les variables d'environnement remplacent les chaînes dans mes fichiers de projet à l'aide du plugin com.google.code.maven-replacer-plugin.

Utiliser ${env.foo}ou ${env.FOO}n'a pas fonctionné pour moi. Maven ne trouvait tout simplement pas la variable. Ce qui fonctionnait, c'était de passer la variable en tant que paramètre de ligne de commande dans Maven. Voici la configuration:

  1. Définissez la variable dans le script shell. Si vous lancez Maven dans un sous-script, assurez-vous que la variable est définie, par exemple en utilisant source ./maven_script.shpour l'appeler depuis le script parent.

  2. Dans shared-pom, créez un paramètre de ligne de commande qui saisit la variable d'environnement:

<plugin>
  ...
  <exécutions>
    <exécutions>
    ...
      <exécution>
      ...
        <configuration>
          <param> $ {foo} </param> <! - Notez que ce n'est * pas * $ {env.foo} ->
        </configuration>
  1. Dans com.google.code.maven-replacer-plugin, définissez la valeur de remplacement ${foo}.

  2. Dans mon script shell qui appelle maven, ajoutez ceci à la commande: -Dfoo=$foo

fjones
la source
0

Vous pouvez utiliser une <properties>balise pour définir une variable personnalisée et un ${variable}modèle pour l'utiliser

<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
la source