Richtige Verwendung der Java-D-Befehlszeilenparameter

147

Wie kann man beim Übergeben eines -D-Parameters in Java die Befehlszeile richtig schreiben und dann über Code darauf zugreifen?

Zum Beispiel habe ich versucht, so etwas zu schreiben ...

if (System.getProperty("test").equalsIgnoreCase("true"))
{
   //Do something
}

Und dann nenne ich es so ...

java -jar myApplication.jar -Dtest="true"

Ich erhalte jedoch eine NullPointerException. Was mache ich falsch?

Ryan Berger
quelle
Erwägen Sie die Verwendung compareToIgnoreCaseanstelle von equalsIgnoreCaseGebietsschema-Agnostikern. Andernfalls könnten Sie unter anderem auf das türkische Vier-Is-Problem stoßen.
McDowell
4
Darf ich vorschlagen, Boolean.getBoolean anstelle der langen if-Anweisung zu verwenden, die Sie haben? shankh.com/2009/07/07/some-fun-with-boolean-getboolean
markieren Sie den
Wofür steht -D?
Anshul

Antworten:

248

Ich vermute, das Problem ist, dass Sie das "-D" nach dem setzen -jar. Versuche dies:

java -Dtest="true" -jar myApplication.jar

Über die Kommandozeilenhilfe:

java [-options] -jar jarfile [args...]

Mit anderen Worten, die Art und Weise, wie Sie es im Moment haben, wird -Dtest="true"als eines der Argumente behandelt, an die übergeben werden muss, mainanstatt als JVM-Argument.

(Sie sollten wahrscheinlich auch die Anführungszeichen löschen, aber es kann trotzdem funktionieren - es hängt wahrscheinlich von Ihrer Shell ab.)

Jon Skeet
quelle
14
Funktioniert jetzt perfekt. Interessant ist auch, dass diese Arten von Parametern im Abschnitt VM-Argumente unter Ausführungskonfigurationen platziert werden müssen, um dieses Verhalten im Eclipse-Debugger zu replizieren.
Ryan Berger
Zumindest von bash funktioniert es mit den Anführungszeichen dort (und erlaubt auch Leerzeichen auf diese Weise), ich benutze dies den ganzen Tag für Ameisenrufe.
Paŭlo Ebermann
Fühle mich ein bisschen dumm, wie viel Zeit ich damit verbracht habe! Vielen Dank für den Hinweis. :)
toidiu
4
Falls sich jemand fragt, ob Sie mehrere Eigenschaften übergeben möchten, verwenden Sie -D einfach mehrmals nach einem 'Leerzeichen'. Java -D <Schlüssel1> = <Wert1> -D <Schlüssel2> = <Wert2> -D <Schlüssel3> = <Wert3 > ...
p_champ
47

Das sollte sein:

java -Dtest="true" -jar myApplication.jar

Dann gibt Folgendes den Wert zurück:

System.getProperty("test");

Der Wert könnte jedoch nullso sein, dass Sie sich vor einer Ausnahme schützen, indem Sie Folgendes verwenden Boolean:

boolean b = Boolean.parseBoolean( System.getProperty( "test" ) );

Beachten Sie, dass die getBooleanMethode den Systemeigenschaftswert delegiert und den Code vereinfacht an:

if( Boolean.getBoolean( "test" ) ) {
   // ...
}
Alain Pannetier
quelle
1
Das letzte Bit gilt auch für: Integer.getInteger("test"); Long.getLong("test")Vorausgesetzt, Sie haben-Dtest=123
mt.uulu
23

Sie geben Ihrem Programm Parameter statt Java. Verwenden

java -Dtest="true" -jar myApplication.jar 

stattdessen.

Erwägen Sie die Verwendung

"true".equalsIgnoreCase(System.getProperty("test"))

die NPE zu vermeiden. Aber verwenden Sie " Yoda-Bedingungen " nicht immer ohne nachzudenken, manchmal ist das Werfen der NPE das richtige Verhalten und manchmal so etwas

System.getProperty("test") == null || System.getProperty("test").equalsIgnoreCase("true")

ist richtig (Standard ist true). Eine kürzere Möglichkeit ist

!"false".equalsIgnoreCase(System.getProperty("test"))

Aber wenn man keine doppelte Negation verwendet, ist es nicht weniger schwer, sie falsch zu verstehen.

Maaartinus
quelle
1
Eigentlich System.getProperty("test", "true").equalsIgnoreCase("true")wäre der bessere Weg, um die letzte Bedingung zu schreiben.
Paŭlo Ebermann
3
Boolean.getBoolean("test");ist eine andere Option. Siehe .
Superfav
@Paulo Ihre Lösung funktioniert nur für Eigenschaften (ich wollte eine allgemeine zeigen), ist aber schöner als meine.
Maaartinus
1
Interessant: In dieser Antwort steht der JVM-Parameter nach dem Flag -jar, während er in der anderen Antwort nach dem "java", aber vor dem Flag -jar steht. Ich gehe dann davon aus, dass der Schlüssel nur darin besteht, dass der JVM-Parameter vor der JAR-Datei selbst steht, in diesem Fall "myApplication.jar"?
Colm Bhandal
1
Daumen hoch, um den Punkt der doppelten Verneinung auf solch offensichtliche Weise zu beweisen.
Silwing