Zmienna środowiskowa z Maven

86

Przeniosłem projekt z Eclipse do Maven i muszę ustawić zmienną środowiskową, aby mój projekt działał.

W Eclipse przechodzę do „Uruchom -> Uruchom konfiguracje” i na karcie „środowisko” ustawiam „WSNSHELL_HOME” na wartość „conf”.

Jak mogę to zrobić z Mavenem?

Dziękuję Ci bardzo!

Gianluca
źródło
Sugerowałbym uruchomienie projektu bez zmiennej środowiskowej. A potem przejdź do Maven.
khmarbaise
3
Nie ma powodu, aby pomijać użycie zmiennych środowiskowych, jeśli jest to przydatne dla twojego systemu i jestem pewien, że moje rozwiązanie działa (sam go używam). Zobacz moją wskazówkę dotyczącą „System.getenv” / „System.getProperty”.
FrVaBe

Odpowiedzi:

120

Możesz po prostu przekazać go w wierszu poleceń, jako

mvn -DmyVariable=someValue install

[Aktualizacja] Zauważ, że kolejność parametrów jest znacząca - musisz określić opcje przed poleceniem (ami). [/Aktualizacja]

W pliku POM możesz odwoływać się do zmiennych systemowych (określonych w wierszu poleceń lub w pom) jako ${myVariable}, a zmienne środowiskowe jako ${env.myVariable}. (Podziękowania dla komentujących za korektę.)

Aktualizacja2

OK, więc chcesz przekazać swoją zmienną systemową do testów. Jeśli - jak zakładam - do testowania używasz wtyczki Surefire , najlepiej jest określić potrzebne zmienne systemowe w pom, w swojej pluginssekcji, np.

<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>
Péter Török
źródło
Muszę uruchomić `` test mvn '', wygląda na to, że nie działa, ponieważ jeśli napiszę test mvn -DWSNSHELL_HOME = conf Nadal otrzymuję wyjątek java.io.FileNotFoundException: null / wsnshell.conf (Brak takiego pliku lub katalogu)
Gianluca
2
@Janky, spróbuj na odwrót, tj mvn -DWSNSHELL_HOME=conf test.
Péter Török
nie ... :( Nadal dostaję java.io.FileNotFoundException: null / wsnshell.conf (Nie ma takiego pliku lub katalogu) ... w kodzie odczytałem zmienną w ten sposób .. System.getenv("WSNSHELL_HOME");czy jest poprawna?
Gianluca
@Janky, chwileczkę, uruchamiasz aplikację bezpośrednio z kompilacji Mavena, czy ...?
Péter Török
43
Mylicie zmienne środowiskowe z właściwościami systemu. Opcja -D polecenia ustawia tylko właściwości systemu.
Wouter Lievens
25

Te -Dwłaściwości nie będą wiarygodne propagowane od SureFire-pluging do badania (nie wiem, dlaczego to działa z Eclipse). Używając maven w wierszu poleceń, użyj właściwości argLine, aby zawinąć swoją właściwość. To przejdzie ich do twojego testu

mvn -DargLine="-DWSNSHELL_HOME=conf" test

Służy System.getPropertydo odczytywania wartości w kodzie. Zajrzyj do tego posta o różnicy System.getenvi Sytem.getProperty.

FrVaBe
źródło
2
Należy czytać właściwość z System.getProperty („WSNSHELL_HOME”) zamiast używać System.getenv.
FrVaBe
Idealnie, po spędzeniu DUŻO czasu na próbowaniu innych rzeczy, ten działał dla mnie.
Bhushan,
Jeśli skonfigurowałeś parametry argLine dla pewnej wtyczki w swoim pom.xml, dodaj ${argLine}symbol zastępczy, w przeciwnym razie parametry z wiersza poleceń nie zostaną pobrane. Przykład:<argLine>-Duser.timezone=UTC ${argLine}</argLine>
sorrymissjackson
To zadziałało dla mnie, dzięki! Cóż za fajne narzędzie do konfigurowania sys-props do testów Mavena. Wciąż na pierwszy rzut oka jest to bardzo zagmatwane, dlaczego nie może ich używać bezpośrednio, ale wymaga dodatkowego argumentu.
phi
9

Możesz umieścić swoje polecenie maven w skrypcie bash:

#!/bin/bash

export YOUR_VAR=thevalue
mvn test
unset YOUR_VAR
model13
źródło
Niewiarygodne, że jest to jedyna metoda, która całkowicie zadziałała przy użyciu wtyczki Surefire. Z około 10 zmiennych środowiska, które ustawiłem w POM, dwie z nich nie są widoczne podczas testu. Nawet jeśli wstawię je do muszli, a potem mvn installnadal są w jakiś sposób zasłonięte. Jeśli jednak uruchomię ze skryptu powłoki, działa dobrze! Chciałabym zrozumieć, dlaczego tak się dzieje.
Pete
Uważam, że powinna to być akceptowana odpowiedź, ponieważ jest to najprostsze rozwiązanie
wtsiamruk
5

Dla zmiennej środowiskowej w Maven możesz ustawić poniżej.

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

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    ...
    <configuration>
        <includes>
            ...
        </includes>
        <environmentVariables>
            <WSNSHELL_HOME>conf</WSNSHELL_HOME>
        </environmentVariables>
    </configuration>
</plugin>
Kevin
źródło
4

Istnieje wtyczka maven o nazwie properties-maven-plugin, która służy set-system-propertiesdo ustawiania zmiennych systemowych. Jest to szczególnie przydatne, jeśli masz plik zawierający wszystkie te właściwości. Możesz więc odczytać plik właściwości i ustawić je jako zmienne systemowe.

chrześcijanin
źródło
3

Innym rozwiązaniem byłoby ustawienie MAVEN_OPTS(lub innych zmiennych środowiskowych) w ${user.home}/.mavenrc(lub %HOME%\mavenrc_pre.batw systemie Windows).

Od wersji Maven 3.3.1 istnieją nowe możliwości ustawiania parametrów wiersza poleceń mvn , jeśli tego właśnie chcesz:

  • ${maven.projectBasedir}/.mvn/maven.config
  • ${maven.projectBasedir}/.mvn/jvm.config
René
źródło
1

w swoim kodzie dodaj:

System.getProperty("WSNSHELL_HOME")

Zmodyfikuj lub dodaj właściwość wartości z polecenia maven:

mvn clean test -DargLine=-DWSNSHELL_HOME=yourvalue

Jeśli chcesz uruchomić go w Eclipse, dodaj argumenty maszyny wirtualnej w konfiguracjach Debug / Run

  • Przejdź do Uruchom -> Uruchom konfiguracje
  • Wybierz Argumenty zakładki
  • Dodaj w sekcji Argumenty maszyny wirtualnej

-DWSNSHELL_HOME = twoja wartość

Zobacz przykład obrazu

nie musisz modyfikować POM

Luis Eduardo Blandon Puello
źródło
0

Zgodnie z dokumentacją z odpowiedzi @ Kevina, poniższa działała dla mnie przy ustawianiu zmiennej środowiskowej za pomocą wtyczki 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
źródło
0

Możesz przekazać niektóre argumenty przez _JAVA_OPTIONSzmienną.

Na przykład zdefiniuj zmienną dla flag proxy maven w następujący sposób:

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

A następnie użyj mvn clean install(automatycznie odbierze _JAVA_OPTIONS).

Davis Benny
źródło