正确使用Java -D命令行参数

时间:2011-02-18 19:22:43

标签: java command-line parameters

在Java中传递-D参数时,编写命令行然后从代码中访问它的正确方法是什么?

例如,我尝试过写这样的东西......

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

然后这样称呼它......

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

但是我收到了NullPointerException。我做错了什么?

3 个答案:

答案 0 :(得分:222)

我怀疑问题是你在 -jar之后放了“-D”。试试这个:

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

从命令行帮助:

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

换句话说,您现在获得它的方式将-Dtest="true"视为传递给main而不是作为JVM参数的参数之一。

(您应该删除引号,但它仍然可以正常工作 - 它可能取决于您的shell。)

答案 1 :(得分:37)

应该是:

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

然后以下将返回值:

System.getProperty("test");

值可以是null,因此使用Boolean防范异常:

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

请注意,getBoolean方法委托系统属性值,将代码简化为:

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

答案 2 :(得分:20)

您为程序提供参数而不是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"))

但不使用双重否定并不会减少误解。