Як посилатися на змінну середовища в POM.xml?


172

Я використовую Maven в якості інструменту побудови. Я встановив змінну середовища, яку називають env. Як я можу отримати доступ до значення цієї змінної середовища у pom.xmlфайлі?


7
Ви можете вказати його на $ {env.XXXXXXXX}, де XXXXXXXX - ваше ім'я змінної. Наприклад, $ {env.PATH} дасть посилання на PATH.
Сешагірі

2
Але ти, мабуть, не повинен. Якщо ви зробите свої конструкції залежними від вашого оточення, їх складніше відтворити.
Стівен C

5
@StephenC Я б не сказав "не повинен", але "будь дуже обережний". Іноді середовище CI та локальне середовище розробників виглядають по-різному, а змінні середовища - це спосіб заповнити прогалини.
Ендрю Білий

1
Для мене IntelliJ 2019 показує ${env.XYZ}посилання як червоний колір. Змінна правильно розгорнута під час виконання, але показується як червона під час компіляції. Тому я маю те саме запитання, яке було задано спочатку.
djangofan

1
Так, це @MarkHan
djangofan

Відповіді:


216

Перегляньте посібник із властивостей Maven ...

Як в коментарях зазначив Сешагірі, ${env.VARIABLE_NAME}зробіть те, що ви хочете.

Я додам слово попередження і скажу, що a pom.xmlповинен повністю описати ваш проект, тому будь ласка, використовуйте змінні середовища з розумом. Якщо ви зробите свої конструкції залежними від вашого оточення, їх складніше відтворити


3
Крім того, це робить вашу платформу побудови та залежною від системи.
lhunath

12
Будьте обережні: усі символи змінної_назви у вашій пам’яті повинні мати верхній регістр, щоб бути незалежними від платформи. Тому що він дійсний лише у верхньому регістрі, який працює в ОС Windows. Наприклад, $ {env.M2_HOME} є дійсним, $ {env.m2_home} недійсним, навіть якщо ви визначили змінну середовища з назвою m2_home.
Джефф Лю

У мене це є у властивостях середовища Windows (WL_HOME = c: \ apps \ Weblogic12 \ wlserver_12.1), але в пам’яті воно повертає це значення 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 можна описати у файлі властивостей. Однак я усвідомлюю, що моє рішення спирається на рамки Весни, тому, ймовірно, це не працює для Даніеля.
EricGreg

це безпечніше, оскільки якщо вам не вдасться змінити значення за допомогою командного рядка / оточення, це все-таки є дійсним POM і складанням зі значення в властивостях.
foo

20

Крім того , переконайтеся , що ваша змінна оточення буде складатися лише великими літерами .... Я не знаю , чому (документація не говорить нічого явного про це, по крайней мере , зв'язок забезпечується White @ Андрій), але якщо змінна - це малі слова (наприклад, env.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

Я боровся з тим самим, запускаючи скрипт оболонки, який встановлював змінні, потім хотів використати змінні в спільній пам’яті. Мета полягала в тому, щоб змінні середовища замінювали рядки в моїх файлах проекту, використовуючи плагін com.google.code.maven-substitucer.

Використання ${env.foo}або ${env.FOO}не працює для мене. Мевен просто не знайшов змінну. Що працювало, було передавання змінної в якості параметра командного рядка в Maven. Ось налаштування:

  1. Встановіть змінну в сценарій оболонки. Якщо ви запускаєте Maven у підкрипті, переконайтеся, що змінна встановлюється, наприклад, використовуючи source ./maven_script.shдля виклику її з батьківського сценарію.

  2. У розділі спільного pom створюйте параметр командного рядка, який захоплює змінну середовища:

<плагін>
  ...
  <виконавці>
    <виконавці>
    ...
      <виконання>
      ...
        <конфігурація>
          <param> $ {foo} </param> <! - Зауважте, що це * not * $ {env.foo} ->
        </configuration>
  1. В com.google.code.maven-substitucer-плагін введіть значення заміни ${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.