Правильное использование параметров командной строки Java -D - PullRequest
136 голосов
/ 18 февраля 2011

При передаче параметра -D в Java, как правильно написать командную строку и затем получить к ней доступ из кода?

Например, я пытался написать что-то вроде этого ...

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

А потом назвал это так ...

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

Но я получилИсключение нулевого указателя.Что я делаю не так?

Ответы [ 3 ]

225 голосов
/ 18 февраля 2011

Я подозреваю, что проблема в том, что вы поставили "-D" после -jar. Попробуйте это:

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

Из справки командной строки:

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

Другими словами, то, как вы сейчас его получите, будет трактовать -Dtest="true" как один из аргументов для передачи main, а не как аргумент JVM.

(Возможно, вам следует также отбросить кавычки, но в любом случае это может сработать - это, вероятно, зависит от вашей оболочки.)

38 голосов
/ 18 февраля 2011

Это должно быть:

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

Тогда следующее будет возвращать значение:

System.getProperty("test");

Однако значение может быть null, поэтому защитите от исключения, используяBoolean:

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

Обратите внимание, что метод getBoolean делегирует значение свойства системы, упрощая код до:

if( Boolean.getBoolean( "test" ) ) {
   // ...
}
21 голосов
/ 18 февраля 2011

Вы даете параметры своей программе вместо Java.Вместо этого используйте

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

.

Подумайте об использовании

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

, чтобы избежать NPE.Но не используйте « условия Йоды » всегда, не задумываясь, иногда выбрасывание NPE - это правильное поведение, а иногда что-то вроде

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

- это правильно (если задано значение по умолчанию true).Более короткая возможность -

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

, но если не использовать двойное отрицание, это не затруднит неправильное понимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...