正确使用 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= -D= -D=...【参考方案2】:

应该是:

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 命令行参数的主要内容,如果未能解决你的问题,请参考以下文章

无法弄清楚如何正确存储命令行参数[关闭]

当程序路径包含空格时,SQL*plus 不会正确标记其命令行参数

如何使用文件的行作为命令的参数?

allure命令行参数

C++,命令行参数未正确解析

eclipse中如何使用命令行参数