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

180

在Java中传递-D参数时,正确的命令行书写方式是什么,并且如何从代码中访问它?

例如,我尝试过像这样写...

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

然后像这样调用它...

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

但是我收到了一个NullPointerException(空指针异常),我做错了什么?


考虑使用 compareToIgnoreCase 而不是 equalsIgnoreCase 来处理与语言环境无关的标识符;否则,您可能会遇到土耳其的四个“İ”的问题,以及其他一些问题。 - McDowell
4
我建议使用Boolean.getBoolean而不是您现有的长if语句。http://www.shankh.com/2009/07/07/some-fun-with-boolean-getboolean/ - mark
-D代表什么? - Anshul
3个回答

294

我猜测问题在于你把"-D"放在了-jar之后。尝试这样做:

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

从命令行帮助中:

java [-options] -jar jarfile [args...]
换句话说,目前的方式会将 -Dtest="true" 视为要传递给 main 的参数之一,而不是作为 JVM 参数。
(你可能还应该去掉引号,但它可能仍能正常工作——这可能取决于你的 shell。)

17
现在功能完美。值得注意的是,在Eclipse调试器中要复制这种行为,必须将这些参数放置在“Run Configurations”下的“VM Arguments”部分中。 - Ryan Berger
1
至少在 bash 中,使用引号可以正常工作(并且也允许空格),我每天都用它来调用 ant。 - Paŭlo Ebermann
1
感觉在那个问题上花了太多时间,有点傻。谢谢你指出来 :) - toidiu
8
如果有人想知道如何传递多个属性,只需要在一个空格后使用"-D"多次即可: java -D<key1>=<value1> -D<key2>=<value2> -D<key3>=<value3>... - Praveen Tiwari

59

应该是这样的:

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

那么接下来的代码将返回该值:

System.getProperty("test");

值可能为null,因此使用Boolean进行异常保护:

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

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

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

3
假设您有-Dtest=123,则对于以下内容也是正确的:Integer.getInteger("test"); Long.getLong("test") - mtuulu

31

你正在给你的程序传递参数,而不是给Java。使用

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

考虑使用 instead

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

避免空指针异常。但不要总是无脑使用“约达条件”,有时抛出空指针异常是正确的行为,而有时则需要像这样:

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
2
有趣的是:在这个答案中,JVM参数出现在“-jar”标志之后,而在另一个答案中,它出现在“java”之后但在“-jar”标志之前。那么我理解的关键是JVM参数必须在JAR文件本身之前,也就是在这种情况下是“myApplication.jar”之前? - Colm Bhandal
太好了。这真的让我更加坚定了。谢谢! - Colm Bhandal
1
赞成你以如此明显的方式证明了双重否定的观点。 - Silwing
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接