我见过很多Java使用-D
选项来传递一些参数。
更常见的方法是通过String[] args
将参数传递给main
方法。
那么这两种方法有什么区别呢?
ADD 1
是否存在必须偏好其中一种方法的情况?
我见过很多Java使用-D
选项来传递一些参数。
更常见的方法是通过String[] args
将参数传递给main
方法。
那么这两种方法有什么区别呢?
是否存在必须偏好其中一种方法的情况?
-D
开关用于设置系统属性,而不是将参数传递给程序。实际上,两种方法甚至没有将信息发送到相同的位置:String[]
参数被发送到您的程序,而开关被发送到虚拟机(从中您的程序可以访问属性,如果需要的话)。
除非您清楚知道为什么需要命令行开关,否则请使用参数。
我同意以上两个答案,但其背后的主要思想是:
==>假设您正在构建一个模块或函数等。现在,您的模块具有一些默认设置,并且这些默认设置可以被用户指定的值覆盖。现在问题来了...main(String [] args)的范围仅限于主函数。这些值只能在“main”函数内部访问...假设您的模块在单独的线程中运行,那么您的模块如何检索用户指定的值?因此,在这种情况下,您将使用-D开关传递参数。可以使用System.getProperty()方法访问这些值。您可以将它们视为用户指定的全局值。希望这有所帮助。
使用 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
选项,插件可以从系统属性中自行获取其参数,这是一种从主程序中解耦的快捷方式。