正确使用 Java -D 命令行参数
Posted
技术标签:
【中文标题】正确使用 Java -D 命令行参数【英文标题】:Proper usage of Java -D command-line parameters 【发布时间】:2011-06-30 01:23:29 【问题描述】:在 Java 中传递 -D 参数时,编写命令行然后从代码中访问它的正确方法是什么?
例如,我尝试过写这样的东西......
if (System.getProperty("test").equalsIgnoreCase("true"))
//Do something
然后这样称呼它......
java -jar myApplication.jar -Dtest="true"
但我收到 NullPointerException。我做错了什么?
【问题讨论】:
考虑使用compareToIgnoreCase
而不是equalsIgnoreCase
用于与语言环境无关的标识符;否则你可能会遇到土耳其四是问题等等。
我可以建议使用 Boolean.getBoolean 而不是您拥有的长 if 语句吗? shankh.com/2009/07/07/some-fun-with-boolean-getboolean
-D 代表什么?
【参考方案1】:
我怀疑问题在于您将“-D”放在-jar
之后。试试这个:
java -Dtest="true" -jar myApplication.jar
从命令行帮助:
java [-options] -jar jarfile [args...]
换句话说,您目前的方式会将-Dtest="true"
视为传递给main
的参数之一,而不是作为JVM 参数。
(你也许应该也去掉引号,但无论如何它可能工作得很好——它可能取决于你的shell。)
【讨论】:
现在完美运行。另外值得注意的是,为了在 Eclipse 调试器中复制这种行为,这些类型的参数必须放在运行配置下的 VM 参数部分中。 至少从 bash 它可以与那里的引号一起使用(并且也允许这种方式的空格),我整天都使用它来进行蚂蚁呼叫。 觉得我花了多少时间在那个上有点愚蠢!感谢您指出了这一点。 :) 如果有人想知道,如果你想传递多个属性,只需在“空格”后多次使用 -D java -D应该是:
java -Dtest="true" -jar myApplication.jar
那么下面会返回值:
System.getProperty("test");
不过,该值可能是null
,因此请使用Boolean
防止出现异常:
boolean b = Boolean.parseBoolean( System.getProperty( "test" ) );
请注意,getBoolean
方法委托系统属性值,将代码简化为:
if( Boolean.getBoolean( "test" ) )
// ...
【讨论】:
最后一点也适用于:Integer.getInteger("test"); Long.getLong("test")
假设您有 -Dtest=123
【参考方案3】:
您将参数提供给程序而不是 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"))
但不使用双重否定并不会减少误解。
【讨论】:
其实System.getProperty("test", "true").equalsIgnoreCase("true")
写最后一个条件会更好。
Boolean.getBoolean("test");
是另一种选择。 See.
@Paulo 您的解决方案仅适用于属性(我想展示一个通用的),但比我的要好。
有趣:在这个答案中,JVM 参数来自 after -jar 标志,而在另一个答案中,它出现在“java”之后但 before -jar 标志。我认为他们的关键只是 JVM 参数位于 JAR 文件本身之前,在本例中为“myApplication.jar”?
为以如此明显的方式证明双重否定的观点而竖起大拇指。以上是关于正确使用 Java -D 命令行参数的主要内容,如果未能解决你的问题,请参考以下文章