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


147

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

例如,我尝试编写类似这样的内容...

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

然后这样称呼它...

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

但是我收到一个NullPointerException。我究竟做错了什么?


考虑使用compareToIgnoreCase而不是与equalsIgnoreCase地区无关的标识符;否则,您可能会遇到土耳其的“四个问题”问题。
McDowell

4
我可以建议使用Boolean.getBoolean代替长的if语句吗?shankh.com/2009/07/07/some-fun-with-boolean-getboolean
马克

-D代表什么?
Anshul

Answers:


248

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

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

从命令行帮助:

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

换句话说,此刻获得的方式将被-Dtest="true"视为要传递的参数之一,main而不是JVM参数。

(您可能应该删除引号,但无论如何它都可能会起作用-它可能取决于您的shell。)


14
现在可以完美运行。同样值得注意的是,为了在Eclipse调试器中复制此行为,必须将这些类型的参数放在“运行配置”下的“ VM参数”部分中。
瑞安·贝格

至少从bash来看,它与那里的引号一起使用(并且也允许这种方式留有空格),我整天都用它来进行蚂蚁呼叫。
圣保罗Ebermann

我在那花了多少时间感到有点愚蠢!感谢您指出了这一点。:)
toidiu '16

4
如果有人想知道,如果您想传递多个属性,只需在'space'java之后多次使用-D -D <key1> = <value1> -D <key2> = <value2> -D <key3> = <value3 > ...
p_champ

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")这是写最后一个条件的更好方法。
圣保罗Ebermann

3
Boolean.getBoolean("test");是另一种选择。请参阅
superfav 2011年

@Paulo您的解决方案仅适用于房地产(我想展示一个通用的解决方案),但比我的更好。
maaartinus 2011年

1
有趣的:在这种应答的JVM参数来的罐子标志,而在对方的回答谈到之后的“java”,但之前的罐子标志。我认为它们的关键只是JVM参数位于JAR文件本身之前,在这种情况下为“ myApplication.jar”?
Colm Bhandal

1
赞成以这种显而易见的方式证明双重否定的观点。
Silwing
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.