web-dev-qa-db-ja.com

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

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

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

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

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

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

しかし、NullPointerExceptionを受け取ります。何が間違っていますか?

134
Ryan Berger

問題は、 "-D" after the -jarを指定したことだと思われます。これを試して:

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

コマンドラインヘルプから:

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

言い換えると、現時点では、-Dtest="true"をJVM引数としてではなく、mainに渡す引数の1つとして扱います。

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

225
Jon Skeet

それは次のとおりです。

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

次に、以下が値を返します。

System.getProperty("test");

ただし、値はnullになる可能性があるため、Booleanを使用して例外から保護してください。

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

getBoolean メソッドはシステムプロパティ値を委任し、コードを次のように簡略化することに注意してください。

if( Boolean.getBoolean( "test" ) ) {
   // ...
}
38
Alain Pannetier

Javaではなくプログラムにパラメーターを与えています。つかいます

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

代わりに。

使用を検討する

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

nPEを回避します。しかし、「Yoda conditions」を常に考えずに使用しないでください。NPEを投げることは正しい動作であり、

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

正しい(デフォルトのtrueを提供)。より短い可能性は

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

ただし、二重否定を使用しなくても誤解しにくくなりません。

21
maaartinus