传递参数的不同方式:String args[]还是-D?

4

我见过很多Java使用-D选项来传递一些参数。

更常见的方法是通过String[] args将参数传递给main方法。

那么这两种方法有什么区别呢?

ADD 1

是否存在必须偏好其中一种方法的情况?


1
Stack Overflow通常鼓励“一个问题对应一个提问”。 - user253751
4个回答

6
< p > -D开关用于设置系统属性,而不是将参数传递给程序。实际上,两种方法甚至没有将信息发送到相同的位置:String[]参数被发送到您的程序,而开关被发送到虚拟机(从中您的程序可以访问属性,如果需要的话)。

除非您清楚知道为什么需要命令行开关,否则请使用参数。


谢谢,我已经更新了我的问题。 - smwikipedia
谢谢你的回答。你能看一下我的回答吗?它被踩了,所以我想知道是否有什么问题。谢谢。 - smwikipedia

1
"程序参数"是传递给您的应用程序的参数,可以通过主方法的"args"字符串数组参数访问。"VM参数"是传递给Java SW解释器的系统属性等参数。
"VM参数"在调用Java解释器(即'java')之后,在Java类之前。"程序参数"在Java类之后。
"VM参数"传递给虚拟机,旨在指示VM执行某些操作。您可以控制堆大小等内容。
"程序参数"可以通过主方法的"main(String args[])"中的"args[]"访问。"

1

我同意以上两个答案,但其背后的主要思想是:
==>假设您正在构建一个模块或函数等。现在,您的模块具有一些默认设置,并且这些默认设置可以被用户指定的值覆盖。现在问题来了...main(String [] args)的范围仅限于主函数。这些值只能在“main”函数内部访问...假设您的模块在单独的线程中运行,那么您的模块如何检索用户指定的值?因此,在这种情况下,您将使用-D开关传递参数。可以使用System.getProperty()方法访问这些值。您可以将它们视为用户指定的全局值。希望这有所帮助。


有趣的情境。 - smwikipedia

-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:javaarchetype:generate 是 Maven 的 plugin:goal 部分。
假设我们不使用 -D 方法。那么我们必须将参数作为命令行参数传递,这意味着我们的主程序(在 Maven 场景中,它是 mvn.bat必须包含所有各种插件参数的解析逻辑。每次制作新插件并需要新参数时,主程序都必须进行修改以反映这一点。这是主程序和插件之间不必要的耦合。使用 -D 选项,插件可以从系统属性中自行获取其参数,这是一种从主程序中解耦的快捷方式。

为什么这个被踩了?如果有什么不正确的地方,请告诉我,这样我就可以改进我的回答。 - smwikipedia
我的回复有点类似于@Manish的。 - smwikipedia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接