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?


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.)


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" ) ) {
   // ...
}

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.