Java -D 명령 행 매개 변수의 올바른 사용법


147

Java에서 -D 매개 변수를 전달할 때 명령 행을 작성하고 코드에서 액세스하는 올바른 방법은 무엇입니까?

예를 들어, 나는 이런 식으로 글을 써 보았습니다 ...

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

그리고 이렇게 부르면 ...

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

그러나 NullPointerException이 발생합니다. 내가 뭘 잘못하고 있죠?


로케일에 독립적 인 식별자 compareToIgnoreCase대신에 사용 하는 것을 고려하십시오 equalsIgnoreCase. 그렇지 않으면, 당신은 무엇보다도 터키의 4-Is 문제에 부딪 칠 수 있습니다.
McDowell

4
긴 if 문 대신 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...]

다시 말해, 현재 가지고있는 방식 은 JVM 인수 대신 -Dtest="true"전달할 인수 중 하나로 취급 됩니다 main.

(당신은 아마한다 또한 따옴표를 삭제하지만, 잘 어쨌든 작동 할 수 -. 아마 쉘에 따라 다름)


14
이제 완벽하게 작동합니다. 또한이 동작을 Eclipse 디버거 내에서 복제하려면 이러한 유형의 매개 변수를 구성 실행의 VM 인수 섹션에 배치해야합니다.
Ryan Berger

적어도 bash 에서 따옴표로 작업하고 공백을 허용합니다. 개미 전화에는 하루 종일 이것을 사용합니다.
Paŭlo Ebermann

내가 그 시간에 얼마나 많은 시간을 보냈는지에 대해 어리석게 느껴지십시오! 지적 해 주셔서 감사합니다. :)
toidiu

4
누군가 궁금해하는 경우 여러 속성을 전달하려면 'space'뒤에 -D를 여러 번 사용하십시오 java -D <key1> = <value1> -D <key2> = <value2> -D <key3> = <value3 > ...
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를 피하기 위해. 그러나 항상 생각하지 않고 " 요다 조건 "을 사용하지 마십시오 . 때로는 NPE를 던지는 것이 올바른 행동이며 때로는

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

맞습니다 (기본 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") 앞에 오도록하는 것만 중요합니다.
Colm Bhandal

1
이중 부정에 대한 요점을 분명한 방법으로 증명 해보자.
Silwing
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.