我看到许多Java使用-D
选项来传递一些参数。
更熟悉的方法是将带有String[] args
的参数传递给main
方法。
那么这两种方法之间的区别是什么?
是否有任何情况我们必须更喜欢一个到另一个?
答案 0 :(得分:6)
-D
开关用于设置系统属性,而不是将参数传递给程序。事实上,这两种方法甚至不会将信息发送到同一个地方:String[]
参数被发送到您的程序,而交换机被发送到虚拟机(如果您的程序可以从中访问属性,它需要)。
除非您清楚知道需要命令行切换的原因,否则请使用参数。
答案 1 :(得分:1)
Program arguments
是传递给应用程序的参数,可以通过main方法的"args"
String数组参数访问。 VM arguments
是诸如传递给Java S W
解释器的系统属性之类的参数。
VM arguments
在调用Java解释器(即' java')之后和Java类之前。 Program arguments
继续学习Java课程。
VM arguments
将传递给虚拟机,旨在指示V M to do something
。您可以执行控制堆大小等操作。
Program args
可通过args[]
方法的main(String args[])
答案 2 :(得分:1)
我同意上述两个答案,但其背后的主要思想是遵循 ==>假设您正在构建模块或功能等。现在你的模块有一些默认设置,这些默认设置可以被用户指定的值覆盖。现在这里是catch .. main(String [] args)的范围只是main函数。这些值只能在“main”函数中访问...假设您的模块在一个单独的线程中运行,那么您的模块将如何检索用户指定的值?因此,在这种情况下,您将使用-D开关传递参数。可以使用System.getProperty()方法访问这些值。您可以将它们视为用户指定的全局值。希望这有帮助
答案 3 :(得分:-1)
使用Maven一段时间之后,我想分享一下我的想法。
Maven本质上是一个插件执行框架。当我使用Maven时,我发现它经常通过-D
选项将参数作为系统属性传递给插件。例如:
mvn exec:java -Dexec.mainClass=org.sonatype.mavenbook.weather.Main -Dexec.args="70112"
和
mvn archetype:generate -DgroupId=org.sonatype.mavenbook -DartifactId=simple -Dpackage=org.sonatype.mavenbook -Dversion=1.0-SNAPSHOT
在上述命令中,exec:java
和archetype:generate
是Maven plugin:goal
部分。
假设我们不使用-D
方法。然后我们必须将参数作为命令行参数传递,这意味着我们的主程序(在Maven场景中,它是mvn.bat
)必须包含所有参数的解析逻辑各种插件。每次创建新插件并需要新参数时,必须修改主程序以反映该情况。这是主程序和插件之间不需要的耦合。使用-D
选项,插件可以从系统属性中自行选取 参数,这是从主程序中解除自身的快捷方式。