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

正确使用Java-D命令行参数,java,command-line,parameters,Java,Command Line,Parameters,在Java中传递a-D参数时,编写命令行然后从代码中访问它的正确方法是什么 例如,我试过写这样的东西 if (System.getProperty("test").equalsIgnoreCase("true")) { //Do something } java -jar myApplication.jar -Dtest="true" 然后像这样称呼它 if (System.getProperty("test").equalsIgnoreCase("true")) { //Do

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

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

if (System.getProperty("test").equalsIgnoreCase("true"))
{
   //Do something
}
java -jar myApplication.jar -Dtest="true"
然后像这样称呼它

if (System.getProperty("test").equalsIgnoreCase("true"))
{
   //Do something
}
java -jar myApplication.jar -Dtest="true"

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

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

java -Dtest="true" -jar myApplication.jar
从命令行帮助中:

java [-options] -jar jarfile [args...]
换言之,您现在获得它的方式将把
-Dtest=“true”
作为传递给
main
的参数之一,而不是作为JVM参数

(您可能也应该删除引号,但无论如何都可能有效-这可能取决于您的shell。)

这应该是:

java -Dtest="true" -jar myApplication.jar
然后,以下内容将返回该值:

System.getProperty("test");
但是,该值可以是
null
,因此请使用
布尔值来防止异常:

boolean b = Boolean.parseBoolean( System.getProperty( "test" ) );
请注意,该方法委托系统属性值,从而将代码简化为:

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

您将参数赋予程序,而不是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"))

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

现在非常有效。另外值得注意的是,为了在Eclipse调试器中复制这种行为,这些类型的参数必须放在运行配置下的VM Arguments部分,我整天都用这个来打蚂蚁电话。我花了多少时间打这个电话,感觉有点傻!谢谢你指出这一点。:)如果有人想知道,如果要传递多个属性,只需在“space”java-D=-D=-D=…之后多次使用-D,实际上,
System.getProperty(“test”,“true”).equalsIgnoreCase(“true”)
将是编写最后一个条件的更好方法。
Boolean.getBoolean(“test”)是另一个选项@Paulo您的解决方案仅适用于属性(我想展示一个通用的解决方案),但比我的解决方案更好。有趣的是:在这个答案中,JVM参数位于-jar标志之后,而在另一个答案中,它位于“java”之后,但在-jar标志之前。然后,我认为他们的关键只是JVM参数在JAR文件本身之前,在这种情况下“MyApple .jar”竖起大拇指,用这种明显的方式来证明双否定的点。考虑使用<代码> CaseReTyEngase而不是<代码>均衡器> /代码>用于区域无关的标识符;否则,您可能会遇到土耳其语的“四是”问题。我建议您使用Boolean.getBoolean而不是您的长if语句,好吗?-D代表什么?最后一位也适用于:
Integer.getInteger(“test”);Long.getLong(“test”)
假设您有
-Dtest=123