webentwicklung-frage-antwort-db.com.de

Richtige Verwendung von Java -D Befehlszeilenparametern

Was ist die richtige Methode, um beim Übergeben eines -D-Parameters in Java die Befehlszeile zu schreiben und dann über Code darauf zuzugreifen?

Ich habe zum Beispiel 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 aber eine NullPointerException. Was mache ich falsch?

138
Ryan Berger

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

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

Über die Befehlszeilenhilfe:

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

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

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

230
Jon Skeet

Das sollte sein:

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

Das Folgende gibt dann den Wert zurück:

System.getProperty("test");

Der Wert könnte jedoch null sein, also schützen Sie sich vor einer Ausnahme mit einem Boolean:

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

Beachten Sie, dass die Methode getBoolean den Systemeigenschaftswert delegiert, wodurch der Code vereinfacht wird:

if( Boolean.getBoolean( "test" ) ) {
   // ...
}
38
Alain Pannetier

Sie übergeben Parameter an Ihr Programm anstatt an Java. Verwenden

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

stattdessen.

Erwägen Sie die Verwendung

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

die NPE zu vermeiden. Aber benutze "Yoda-Bedingungen" nicht immer ohne nachzudenken, manchmal ist das Werfen der NPE das richtige Verhalten und manchmal sowas

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

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

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

wenn Sie jedoch keine doppelte Verneinung verwenden, wird das Missverständnis nicht weniger schwer.

22
maaartinus