Правильне використання параметрів командного рядка Java -D


147

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

Наприклад, я спробував написати щось подібне ...

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

А потім називати це так ...

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

Але я отримую NullPointerException. Що я роблю неправильно?


розглянути можливість використання compareToIgnoreCaseзамість equalsIgnoreCaseлокально-агностичних ідентифікаторів; в іншому випадку ви можете зіткнутися з проблемою турецької четвірки, серед інших.
Макдауелл

4
Чи можу я запропонувати використовувати Boolean.getBoolean замість довгої заяви, якщо у вас є? shankh.com/2009/07/07/some-fun-with-boolean-getboolean
відмітка

Що означає -D означає?
Anshul

Відповіді:


248

Я підозрюю , що проблема в тому , що ви поставити «-D» після-jar . Спробуйте це:

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

У довідці командного рядка:

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

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

(Ви, ймовірно, також повинні відмовитись від лапок, але це все одно може спрацювати - це, мабуть, залежить від вашої оболонки.)


14
Працює ідеально зараз. Також цікаво відзначити, що для того, щоб повторити цю поведінку в налагоджувачі Eclipse, ці параметри повинні бути розміщені в розділі Аргументи VM у розділі Запустити конфігурації.
Райан Бергер

Принаймні, з bash він працює з цитатами (а також дозволяє пробіли таким чином), я використовую це весь день для мурашних дзвінків.
Paŭlo Ebermann

Відчуваю себе дурним, скільки часу я витратив на це! Дякуємо, що вказали на це. :)
toidiu

4
якщо вам хтось цікавиться, якщо ви хочете передати кілька властивостей, просто використовуйте -D кілька разів після «пробілу» Java -D <key1> = <значення1> -D <ключ2> = <значення2> -D <ключ3> = <значення3 > ...
p_champ

48

Це повинно бути:

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

Тоді наступне поверне значення:

System.getProperty("test");

Значення може бути null, проте захищайте від винятку, використовуючи Boolean:

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

Зауважте, що getBooleanметод делегує значення системного властивості, спрощуючи код до:

if( Boolean.getBoolean( "test" ) ) {
   // ...
}

1
Останній біт також справедливий для: Integer.getInteger("test"); Long.getLong("test")якщо припустити, що ви-Dtest=123
mt.uulu

23

Ви замість Java надаєте параметри для своєї програми. Використовуйте

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

замість цього.

Подумайте про використання

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

щоб уникнути NPE. Але не використовуйте " умови Yoda " завжди, не замислюючись, іноді кидати NPE - це правильна поведінка, а іноді щось подібне

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

є правильним (надання істинного за замовчуванням). Більш коротка можливість

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

але використання подвійного заперечення не робить його менш важким для розуміння.


1
Власне, System.getProperty("test", "true").equalsIgnoreCase("true")був би кращий спосіб написати останню умову.
Paŭlo Ebermann

3
Boolean.getBoolean("test");інший варіант. Див .
superfav

@Paulo Ваше рішення працює лише для властивостей (я хотів показати загальне), але приємніше мого.
maaartinus

1
Цікаво: у цій відповіді параметр JVM приходить після прапора -jar, а в іншій відповіді - після "java", але перед прапором -jar. Я вважаю, що вони ключові лише в тому, що параметр JVM приходить перед самим файлом JAR, в цьому випадку "myApplication.jar"?
Колм Бхандал

1
Великі пальці для доведення точки про подвійне заперечення таким очевидним способом.
Сріблення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.