Переменная среды с Maven

86

Я перенес проект из Eclipse в Maven, и мне нужно установить переменную среды, чтобы мой проект заработал.

В Eclipse я перехожу к «Выполнить -> Выполнить конфигурации» и на вкладке «Среда» устанавливаю для «WSNSHELL_HOME» значение «conf».

Как я могу это сделать с Maven?

Большое спасибо!

Джанлука
источник
Я бы посоветовал запустить ваш проект без переменной окружения. А затем перейти к maven.
khmarbaise 01
3
Нет причин отказываться от использования переменных окружения, если это полезно для вашей системы, и я совершенно уверен, что мое решение работает (я сам его использую). См. Мою подсказку по поводу «System.getenv» / «System.getProperty».
FrVaBe

Ответы:

121

Вы можете просто передать его в командной строке, как

mvn -DmyVariable=someValue install

[Обновить] Обратите внимание, что порядок параметров важен - вам необходимо указать любые параметры перед командой (ами). [/Обновить]

В файле POM вы можете ссылаться на системные переменные (указанные в командной строке или в pom) как на ${myVariable}, а переменные среды как ${env.myVariable}. (Спасибо комментаторам за исправление.)

Обновление2

Итак, вы хотите передать свою системную переменную своим тестам. Если - как я предполагаю - вы используете плагин Surefire для тестирования, лучше всего указать необходимые системные переменные внутри pom, в вашем pluginsразделе, например

<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            ...
            <configuration>
                ...
                <systemPropertyVariables>
                    <WSNSHELL_HOME>conf</WSNSHELL_HOME>
                </systemPropertyVariables>
            </configuration>
        </plugin>
        ...
    </plugins>
</build>
Петер Торок
источник
Мне нужно запустить 'mvn test', похоже, он не работает, потому что, если я напишу mvn test -DWSNSHELL_HOME = conf, я все равно получу исключение java.io.FileNotFoundException: null / wsnshell.conf (такого файла или каталога нет)
Джанлука
2
@Janky, попробуйте это наоборот, то есть mvn -DWSNSHELL_HOME=conf test.
Péter Török
нет ... :( Я все еще получаю java.io.FileNotFoundException: null / wsnshell.conf (Нет такого файла или каталога) ... в коде я прочитал переменную таким образом .. System.getenv("WSNSHELL_HOME");это правильно?
Джанлука,
@Janky, подождите, вы запускаете приложение прямо из сборки Maven или ...?
Péter Török
44
Вы двое путаете переменные среды со свойствами системы. Параметр команды -D устанавливает только свойства системы.
Воутер Ливенс,
25

Эти -Dсвойства не будут надежными размножают от безошибочного-pluging к тесту (я не знаю , почему он работает с затмением). При использовании maven в командной строке используйте свойство argLine, чтобы обернуть ваше свойство. Это передаст их на ваш тест

mvn -DargLine="-DWSNSHELL_HOME=conf" test

Используйте, System.getPropertyчтобы прочитать значение в вашем коде. Прочтите этот пост о разнице между System.getenvи Sytem.getProperty.

FrVaBe
источник
2
Вы должны прочитать свойство с помощью System.getProperty ("WSNSHELL_HOME") вместо использования System.getenv.
FrVaBe 03 апр.'11
Отлично, после того, как я потратил МНОГО времени на другие вещи, это сработало для меня.
Bhushan
Если вы настроили параметры argLine для плагина surefire в своем pom.xml, добавьте ${argLine}заполнитель, иначе параметры из командной строки не будут выбраны. Пример:<argLine>-Duser.timezone=UTC ${argLine}</argLine>
sorrymissjackson 09
У меня это сработало, спасибо! Какой изящный инструмент для настройки sys-props для тестов maven. Тем не менее, на первый взгляд, это очень сбивает с толку, почему он не может использовать их напрямую, а требует дополнительного аргумента.
пхи
9

Вы можете обернуть свою команду maven в сценарий bash:

#!/bin/bash

export YOUR_VAR=thevalue
mvn test
unset YOUR_VAR
modle13
источник
Невероятно, но это единственный метод, который полностью работал у меня с использованием плагина Surefire. Из 10 или около того env vars, которые я установил в POM, два из них не видны при тестовом запуске. Даже если я помещаю их в оболочку, а затем mvn install, они все равно как-то затемняются. Однако, если я запускаю сценарий оболочки, он работает нормально! Хотел бы я понять, почему это происходит.
Пит
Я считаю, что это должен быть принятый ответ, поскольку это простейшее решение
wtsiamruk
5

Для переменной среды в Maven вы можете установить ниже.

http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#environmentVariables http://maven.apache.org/surefire/maven-failsafe-plugin/integration-test-mojo.html #environmentVariables

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    ...
    <configuration>
        <includes>
            ...
        </includes>
        <environmentVariables>
            <WSNSHELL_HOME>conf</WSNSHELL_HOME>
        </environmentVariables>
    </configuration>
</plugin>
Кевин
источник
4

Существует плагин maven под названием properties-maven-plugin, который позволяет set-system-propertiesустановить системные переменные. Это особенно полезно, если у вас есть файл, содержащий все эти свойства. Таким образом, вы можете прочитать файл свойств и установить их как системную переменную.

Христианин
источник
3

Другое решение - установить MAVEN_OPTS(или другие переменные среды) в ${user.home}/.mavenrc(или %HOME%\mavenrc_pre.batв окнах).

Начиная с Maven 3.3.1 появились новые возможности для установки параметров командной строки mvn , если это действительно то, что вам нужно:

  • ${maven.projectBasedir}/.mvn/maven.config
  • ${maven.projectBasedir}/.mvn/jvm.config
Рене
источник
1

в вашем коде добавьте:

System.getProperty("WSNSHELL_HOME")

Измените или добавьте свойство значения с помощью команды maven:

mvn clean test -DargLine=-DWSNSHELL_HOME=yourvalue

Если вы хотите запустить его в Eclipse, добавьте аргументы виртуальной машины в свои конфигурации Debug / Run.

  • Зайдите в Run -> Run configurations
  • Выберите аргументы вкладки
  • Добавить в раздел Аргументы ВМ

-DWSNSHELL_HOME = ваше значение

См. Пример изображения

вам не нужно изменять POM

Луис Эдуардо Бландон Пуэлло
источник
0

Следуя документации из ответа @ Kevin, приведенный ниже работал у меня для установки переменной среды с плагином maven sure-fire

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
    <environmentVariables>
        <WSNSHELL_HOME>conf</WSNSHELL_HOME>
    </environmentVariables>
</configuration>
Yuvaraj G
источник
0

Вы можете передать некоторые аргументы через _JAVA_OPTIONSпеременную.

Например, определите переменную для флагов прокси maven следующим образом:

_JAVA_OPTIONS="-Dhttp.proxyHost=$http_proxy_host -Dhttp.proxyPort=$http_proxy_port -Dhttps.proxyHost=$https_proxy_host -Dhttps.proxyPort=$http_proxy_port"

А потом пользуйтесь mvn clean install(подхватит автоматически _JAVA_OPTIONS).

Дэвис Бенни
источник