【问题标题】:Proper usage of Java -D command-line parameters正确使用 Java -D 命令行参数
【发布时间】: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 代表什么?

标签: java command-line parameters


【解决方案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”?
  • 为以如此明显的方式证明双重否定的观点而竖起大拇指。
猜你喜欢
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2011-08-25
  • 2010-10-17
相关资源
最近更新 更多