Umgebungsvariable mit Maven

84

Ich habe ein Projekt von Eclipse nach Maven portiert und muss eine Umgebungsvariable festlegen, damit mein Projekt funktioniert.

In Eclipse gehe ich zu "Ausführen -> Konfigurationen ausführen" und setze unter der Registerkarte "Umgebung" "WSNSHELL_HOME" auf den Wert "conf".

Wie kann ich das mit Maven machen?

Vielen Dank!

Gianluca
quelle
Ich würde vorschlagen, Ihr Projekt ohne Umgebungsvariable zum Laufen zu bringen. Und dann zu Maven gehen.
Khmarbaise
3
Es gibt keinen Grund, die Verwendung von Umgebungsvariablen zu überspringen, wenn dies für Ihr System nützlich ist, und ich bin mir ziemlich sicher, dass meine Lösung funktioniert (ich verwende sie selbst). Siehe meinen Hinweis bezüglich 'System.getenv' / 'System.getProperty'.
FrVaBe

Antworten:

118

Sie können es einfach über die Befehlszeile übergeben, als

mvn -DmyVariable=someValue install

[Update] Beachten Sie, dass die Reihenfolge der Parameter von Bedeutung ist - Sie alle Optionen angeben müssen , bevor der Befehl (s). [/Aktualisieren]

In der POM-Datei können Sie auf Systemvariablen (in der Befehlszeile oder im POM angegeben) als ${myVariable}und Umgebungsvariablen als verweisen ${env.myVariable}. (Danke an die Kommentatoren für die Korrektur.)

Update2

OK, Sie möchten Ihre Systemvariable an Ihre Tests übergeben. Wenn Sie - wie ich annehme - das Surefire-Plugin zum Testen verwenden, ist es am besten, die erforderlichen Systemvariablen innerhalb des POM in Ihrem pluginsAbschnitt anzugeben , z

<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
quelle
Ich muss 'mvn test' starten, es scheint nicht zu funktionieren, denn wenn ich mvn test schreibe -DWSNSHELL_HOME = conf erhalte ich immer noch die Ausnahme java.io.FileNotFoundException: null / wsnshell.conf (Keine solche Datei oder kein solches Verzeichnis)
Gianluca
2
@ Janky, versuchen Sie es umgekehrt, dh mvn -DWSNSHELL_HOME=conf test.
Péter Török
nein ... :( Ich bekomme immer noch java.io.FileNotFoundException: null / wsnshell.conf (Keine solche Datei oder kein solches Verzeichnis) ... im Code habe ich die Variable auf diese Weise gelesen .. System.getenv("WSNSHELL_HOME");ist es richtig?
Gianluca
@Janky, warte eine Minute, starte die App direkt vom Maven Build oder ...?
Péter Török
41
Sie beide verwechseln Umgebungsvariablen mit Systemeigenschaften. Die Befehlsoption -D legt nur die Systemeigenschaften fest.
Wouter Lievens
25

Die -DEigenschaften werden nicht zuverlässig vom todsicheren Plug-in zu Ihrem Test weitergegeben (ich weiß nicht, warum es mit Eclipse funktioniert). Wenn Sie maven in der Befehlszeile verwenden, verwenden Sie die Eigenschaft argLine , um Ihre Eigenschaft zu verpacken. Dies wird sie zu Ihrem Test bestehen

mvn -DargLine="-DWSNSHELL_HOME=conf" test

Verwenden Sie System.getPropertydiese Option , um den Wert in Ihrem Code zu lesen. Schauen Sie sich diesen Beitrag über den Unterschied von System.getenvund an Sytem.getProperty.

FrVaBe
quelle
2
Sie sollten die Eigenschaft mit System.getProperty ("WSNSHELL_HOME") lesen, anstatt System.getenv zu verwenden.
FrVaBe
Perfekt, nachdem ich viel Zeit damit verbracht hatte, andere Dinge auszuprobieren, funktionierte dieser für mich.
Bhushan
Wenn Sie argLine-Parameter für das todsichere Plugin in Ihrer pom.xml konfiguriert haben, fügen Sie den ${argLine}Platzhalter hinzu, andernfalls werden die Parameter von der Befehlszeile nicht übernommen. Beispiel:<argLine>-Duser.timezone=UTC ${argLine}</argLine>
sorrymissjackson
Das hat bei mir funktioniert, danke! Was für ein tolles Tool, um Sys-Requisiten für Maven-Tests zu konfigurieren. Noch auf den ersten Blick ist es sehr verwirrend, warum es sie nicht direkt verwenden kann, sondern ein zusätzliches Argument erfordert.
Phi
9

Sie können Ihren Maven-Befehl in ein Bash-Skript einbinden:

#!/bin/bash

export YOUR_VAR=thevalue
mvn test
unset YOUR_VAR
modle13
quelle
Unglaublicherweise ist dies die einzige Methode, die mit dem Surefire-Plugin für mich vollständig funktioniert hat. Von den etwa 10 im POM festgelegten Umgebungsvariablen werden zwei beim Testlauf nicht angezeigt. Selbst wenn ich sie dann in die Schale setze mvn install, sind sie immer noch irgendwie verdeckt. Wenn ich jedoch ein Shell-Skript verwende, funktioniert es einwandfrei! Ich wünschte, ich hätte verstanden, warum das passiert.
Pete
Ich glaube, dies sollte eine akzeptierte Antwort sein, da dies die einfachste Lösung ist
wtsiamruk
5

Für Umgebungsvariablen in Maven können Sie unten festlegen.

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

<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
quelle
4

Es gibt ein Maven-Plugin namens Properties-Maven-Plugin. Dieses Plugin bietet das Ziel set-system-properties, Systemvariablen festzulegen . Dies ist besonders nützlich, wenn Sie eine Datei mit all diesen Eigenschaften haben. Sie können also eine Eigenschaftendatei lesen und als Systemvariable festlegen.

Christian
quelle
3

Eine andere Lösung wäre das Setzen MAVEN_OPTS(oder anderer Umgebungsvariablen) in ${user.home}/.mavenrc(oder%HOME%\mavenrc_pre.bat unter Windows).

Seit Maven 3.3.1 gibt es neue Möglichkeiten, mvn-Befehlszeilenparameter festzulegen , wenn Sie dies tatsächlich möchten:

  • ${maven.projectBasedir}/.mvn/maven.config
  • ${maven.projectBasedir}/.mvn/jvm.config
René
quelle
1

Fügen Sie in Ihrem Code Folgendes hinzu:

System.getProperty("WSNSHELL_HOME")

Ändern oder Hinzufügen einer Werteigenschaft über den Befehl maven:

mvn clean test -DargLine=-DWSNSHELL_HOME=yourvalue

Wenn Sie es in Eclipse ausführen möchten, fügen Sie VM-Argumente in Ihre Debug / Run-Konfigurationen ein

  • Gehen Sie zu Ausführen -> Konfigurationen ausführen
  • Wählen Sie Tab-Argumente
  • Fügen Sie im Abschnitt VM-Argumente hinzu

-DWSNSHELL_HOME = Ihr Wert

Siehe Bildbeispiel

Sie müssen das POM nicht ändern

Luis Eduardo Blandon Puello
quelle
0

Nach der Dokumentation von @ Kevins Antwort hat die folgende für mich funktioniert, um die Umgebungsvariable mit dem Maven Safe-Fire-Plugin festzulegen

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
    <environmentVariables>
        <WSNSHELL_HOME>conf</WSNSHELL_HOME>
    </environmentVariables>
</configuration>
Yuvaraj G.
quelle
0

Sie können einige der Argumente durch die übergeben _JAVA_OPTIONS Variable übergeben.

Definieren Sie beispielsweise eine Variable für Maven-Proxy-Flags wie folgt:

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

Und dann verwenden mvn clean install(es wird automatisch aufgenommen _JAVA_OPTIONS).

Davis Benny
quelle