Як посилатися на змінну середовища в 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.