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

Rya*_*ger 142 java parameters command-line

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

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

if (System.getProperty("test").equalsIgnoreCase("true"))
{
   //Do something
}
Run Code Online (Sandbox Code Playgroud)

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

java -jar myApplication.jar -Dtest="true"
Run Code Online (Sandbox Code Playgroud)

但是我收到了NullPointerException.我究竟做错了什么?

Jon*_*eet 234

我怀疑的问题是,你已经把"-D" 之后-jar.试试这个:

java -Dtest="true" -jar myApplication.jar
Run Code Online (Sandbox Code Playgroud)

从命令行帮助:

java [-options] -jar jarfile [args...]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 现在工作得很好.另外值得注意的是,为了在Eclipse调试器中复制此行为,必须将这些类型的参数放在"运行配置"下的"VM参数"部分中. (13认同)
  • 如果有人想知道,如果您想传递多个属性,只需在'space'java之后多次使用-D -D <key1> = <value1> -D <key2> = <value2> -D <key3> = <value3 > ... (3认同)

Ala*_*ier 43

那应该是:

java -Dtest="true" -jar myApplication.jar
Run Code Online (Sandbox Code Playgroud)

然后以下将返回值:

System.getProperty("test");
Run Code Online (Sandbox Code Playgroud)

null但是,该值可能是使用以下内容防止异常Boolean:

boolean b = Boolean.parseBoolean( System.getProperty( "test" ) );
Run Code Online (Sandbox Code Playgroud)

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

if( Boolean.getBoolean( "test" ) ) {
   // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 最后一点也适用于: `Integer.getInteger("test"); Long.getLong("test")` 假设你有 `-Dtest=123` (3认同)

maa*_*nus 22

您正在为程序提供参数而不是Java.使用

java -Dtest="true" -jar myApplication.jar 
Run Code Online (Sandbox Code Playgroud)

代替.

考虑使用

"true".equalsIgnoreCase(System.getProperty("test"))
Run Code Online (Sandbox Code Playgroud)

避免NPE.但是不要总是不加思索地使用" 尤达条件 ",有时候抛出NPE是正确的行为,有时甚至是类似的行为

System.getProperty("test") == null || System.getProperty("test").equalsIgnoreCase("true")
Run Code Online (Sandbox Code Playgroud)

是对的(提供默认值为true).更短的可能性是

!"false".equalsIgnoreCase(System.getProperty("test"))
Run Code Online (Sandbox Code Playgroud)

但不使用双重否定并不会使其更难以误解.

  • `Boolean.getBoolean("test");`是另一种选择.[见](http://download.oracle.com/javase/6/docs/api/java/lang/Boolean.html#getBoolean(java.lang.String中)). (3认同)
  • 有趣的是:在这个答案中,JVM 参数位于 -jar 标志之后,而在另一个答案中,它位于“java”之后但 -jar 标志之前。我认为它们的关键只是 JVM 参数出现在 JAR 文件本身之前,在本例中是“myApplication.jar”? (2认同)