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.