Как ссылаться на переменную среды в POM.xml?


172

Я использую Maven в качестве инструмента для сборки. Я установил переменную среды с именем env. Как я могу получить доступ к значению этой переменной среды в pom.xmlфайле?


7
вы можете ссылаться на него с помощью $ {env.XXXXXXXX}, где XXXXXXXX - это имя вашей переменной. Например, $ {env.PATH} даст ссылку на PATH.
Сешагири

2
Но вы, вероятно, не должны. Если вы делаете свои сборки зависимыми от вашей среды, их сложнее воспроизвести.
Стивен С.

5
@ StephhenC Я бы не сказал «не должен», но «будь очень осторожен». Иногда среда CI и локальная среда разработки выглядят по-разному, и переменные среды - это способ заполнить пробелы.
Эндрю Уайт

1
Для меня IntelliJ 2019 показывает ${env.XYZ}ссылку красным цветом. Переменная корректно раскрывается во время выполнения, но отображается красным цветом во время компиляции. Поэтому у меня тот же вопрос, который был задан изначально.
Джангофан

1
Да, это делает @MarkHan
djangofan

Ответы:


216

Проверьте Maven Руководство по свойствам ...

Как отметил Сешагири в комментариях, ${env.VARIABLE_NAME}будет делать то, что вы хотите.

Я добавлю слово предупреждения и скажу, что pom.xmlдолжен полностью описать ваш проект, поэтому, пожалуйста, используйте переменные среды разумно. Если вы делаете свои сборки зависимыми от вашей среды, их труднее воспроизвести


3
Кроме того, это делает вашу сборку зависимой от платформы и системы.
лунат

12
Будьте осторожны: все символы variable_name в вашем pom должны быть в верхнем регистре, чтобы не зависеть от платформы. Поскольку он действителен только в верхнем регистре, работающем в ОС Windows Например, $ {env.M2_HOME} допустим, $ {env.m2_home} недопустим, даже если вы определили переменную среды с именем m2_home.
Джефф Лю

У меня есть это в свойствах среды Windows (WL_HOME = c: \ apps \ Weblogic12 \ wlserver_12.1), но в pom он возвращает это значение c: \ apps \ Weblogic12 \ wlserver (без_12.1) любой идеи, где еще может выбрать maven это из?
Ананд Рокцз

Просто понял, что я определяю правильно названный <wl_home> $ {WL_HOME} </ wl_home> и использую это и каким-то образом ссылался без версии, если я это сделаю.
Ананд Рокзз

Он отлично работает в Windows для IDE и CLI. Для MacOS / Linux / Unix это немного сложно получить поддержку от IDE, где, без сомнения, для Terminal , он работает нормально.
Md Shahed Hossain

29

Может быть безопаснее напрямую передавать переменные окружения в системные свойства maven. Например, скажем, в Linux вы хотите получить доступ к переменной окружения MY_VARIABLE. Вы можете использовать системное свойство в вашем файле pom.

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

Установите значение свойства в командной строке maven:

mvn clean package -Dmy.variable=$MY_VARIABLE

4
почему это безопаснее?
Weberjn

Это не работает для меня, новое значение my.variable, предоставленное в командной строке, никогда не переопределяет значение в блоке <properties>. Любые идеи?
Даниэль Скотт

Для меня более безопасные или, по крайней мере, менее загадочные, свойства b / c могут быть описаны в файле свойств. Тем не менее, я понимаю, что мое решение опирается на среду Spring, поэтому, вероятно, оно не работает для Дэниела.
EricGreg

это безопаснее, потому что если вам не удастся изменить значение с помощью командной строки / среды, оно все равно будет действительным POM и сборкой, исходя из значения в свойствах.
Foo

20

Кроме того , убедитесь , что ваша переменная окружения будет состоять только заглавные буквы .... Я не знаю , почему (документация не говорит ничего явного об этом, по крайней мере , связь обеспечивается White @ Андрей), но если переменная является словом нижнего регистра (например, env.dummy), переменная всегда была пустой или нулевой ...

Я боролся с этим, как час, пока я не решил попробовать переменную UPPER CASE, и проблема решилась.

OK Переменные Примеры:

  • DUMMY
  • DUMMY_ONE
  • JBOSS_SERVER_PATH

( ПРИМЕЧАНИЕ : я использовал maven v3.0.5)

Надеюсь, что это может кому-то помочь ....


5
Переменные среды в unix чувствительны к регистру и традиционно получают имена в верхнем регистре, поэтому, когда вы смотрите на переменные, установленные в вашей оболочке, вы можете легко различить, какие локально установлены для вашей оболочки, а какие видны дочерним процессам. Переменные среды в Windows не чувствительны к регистру, но я не проверял это из документации, только из небольшого эксперимента в командной строке.
узаконить

11

Разве мы не можем использовать

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

Это неявное, в отличие от того, когда вы передаете его с -D, который делает его явным и переопределяет значение свойства по умолчанию, которое может быть все еще полезно для установки среды с нулевой конфигурацией (например, dev)
Technoshaft

1
Это работает? Я пробовал, и это не так, по крайней мере, не в моем окружении
user26270

3

Я боролся с тем же, запустив скрипт оболочки, который устанавливает переменные, а затем захотел использовать переменные в shared-pom. Цель состояла в том, чтобы переменные среды заменили строки в файлах моего проекта с помощью com.google.code.maven-replacer-plugin.

Использование ${env.foo}или ${env.FOO}не работает для меня. Мейвен просто не нашел переменную. То, что работало, передавало переменную в качестве параметра командной строки в Maven. Вот настройки:

  1. Установите переменную в сценарии оболочки. Если вы запускаете Maven с помощью вспомогательного сценария, убедитесь, что переменная установлена, например, используется source ./maven_script.shдля вызова из родительского сценария.

  2. В shared-pom создайте параметр командной строки, который получает переменную среды:

<Плагин>
  ...
  <казни>
    <казни>
    ...
      <Исполнение>
      ...
        <Конфигурация>
          <param> $ {foo} </ param> <! - Обратите внимание, что это * не * $ {env.foo} ->
        </ Конфигурация>
  1. В com.google.code.maven-replacer-plugin введите значение замены ${foo}.

  2. В моем сценарии оболочки, который вызывает maven, добавьте это в команду: -Dfoo=$foo


0

Вы можете использовать <properties>тег, чтобы определить пользовательскую переменную и ${variable}шаблон, чтобы использовать его

<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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.