Java -Dコマンドラインパラメータの適切な使用法


147

Javaで-Dパラメーターを渡す場合、コマンドラインを記述してコードからアクセスする適切な方法は何ですか?

たとえば、私はこのようなものを書いてみました...

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

そして、次のように呼び出します...

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

しかし、NullPointerExceptionを受け取ります。何が悪いのですか?


ロケールに依存しない識別子のcompareToIgnoreCase代わりにequalsIgnoreCaseを使用することを検討してください。さもなければ、とりわけトルコの4つの問題にぶつかることがあります。
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"渡す引数の1つとして扱われmainます。

(おそらく引用符削除する必要がありますが、とにかくうまくいくかもしれません-それはおそらくあなたのシェルに依存します。)


14
今は完全に動作します。また、興味深いことに、Eclipseデバッガー内でこの動作を再現するには、これらのタイプのパラメーターを「実行構成」の「VM引数」セクションに配置する必要があります。
Ryan Berger

少なくともbashからは引用符で機能します(また、このようにスペースを使用できます)。これは、ant-callsに終日使用します。
–PaŭloEbermann、2011

私がどれだけの時間を費やしたかについて、ちょっとばかげたことを感じてください!ご指摘いただきありがとうございます。:)
toidiu

4
誰かが疑問に思っている場合、複数のプロパティを渡したい場合は、「スペース」の後に-Dを複数回使用するだけですjava -D <key1> = <value1> -D <key2> = <value2> -D <key3> = <value3 > ...
p_champ 2018年

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ŭloEbermann、2011

3
Boolean.getBoolean("test");別のオプションです。を参照してください
superfav

@Pauloあなたのソリューションはプロパティに対してのみ機能します(私は一般的なものを示したかったのですが)私のソリューションよりも優れています。
maaartinus 2011

1
興味深い:この回答では、JVMパラメーターは-jarフラグの後にありますが、他の回答では、「java」の後、-jarフラグの前にあります。そこで、それらのキーは、JVMパラメータがJARファイル自体の前にあるということだけであると考えます。この場合は「myApplication.jar」ですか。
Colm Bhandal 2017年

1
このような明白な方法で二重否定に関する要点を証明したことに対して賛成です。
2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.