让我们假设一个Java应用程序,它接受一个整数命令行参数,比如bubu。
假设一个人使用一个像样的命令行解析器(我做了- https://github.com/jopt-simple/jopt-simple),并记住-D java开关,以下是传递此命令行参数的一些典型方法:
--bubu 5 (或--bubu5)-Dbubu=5或--bubu=5
其中,第一个参数是程序参数,必须由应用程序使用某个命令行解析器处理,而第二个参数是VM参数,已经被java解析,使其可以作为Integer.getInteger("bubu")使用。
我有点困惑。我应该使用什么?使用系统属性工具:
据我所知,唯一的缺点是所有命令行选项都必须使用-D标志。
求求你,我的建议。
谢谢。
编辑
系统参数的另一个优点--“即使应用程序不是从主应用程序开始的独立应用程序,但当应用程序是when应用程序或单元测试时,它们也是可用的。”-感谢https://stackoverflow.com/users/571407/jb-nizet。
EDIT2
让我在这里更专注一些。是否有任何严肃的原因(除了美学)不像往常一样使用系统参数?
EDIT3
好了,我想我现在明白了。如果我的代码很可能是由web应用程序加载的,那么就存在潜在的名称冲突问题,因为由相同web容器托管的其他web应用程序与我的代码共享系统属性空间。
因此,我必须谨慎行事,事先消除我的系统属性的歧义。所以,不再有bubu了,现在是com.shunra.myapp.bubu了。这意味着,不是简单的
-Dbubu=5我有过
-Dcom.shunra.myapp.bubu=5这对于简单的命令行应用程序来说就不那么有吸引力了。
Mark Peters给出了另一个原因,这对我来说很好。
发布于 2011-12-28 16:10:00
我认为Fortyrunner引用的优势实际上是对系统属性最重要的负面影响--任何需要它们的人都可以使用它们。
如果标志或选项是命令行选项,则它应该可用于处理从命令行获取输入的代码层或模块,而不是请求它的任何代码。
您可以从全局状态获得一些破坏性耦合,并且系统属性与任何其他全局状态没有什么不同。
也就是说,如果你只是想做一个又快又脏的CLI程序,关注点和耦合的分离对你来说并不是一个大问题,系统属性给了你一个简单的方法,但却会导致(IMO)糟糕的用户体验。一些getopt库将为构建良好的CLI用户体验提供更多支持。
发布于 2011-12-28 16:03:49
系统属性的主要优点之一是,它们在程序生命周期内的任何时候都可用。
命令行参数仅在main方法中可用(除非您将它们持久化)。
发布于 2011-12-28 16:25:12
我觉得有很多像我这样的普通用户不需要知道的事情。系统属性将帮助系统开发人员预先设置使系统能够运行的多个值。例如,当我下载GlassFish应用服务器时,它总是带有许多预置参数,我不知道它们是用来做什么的。我在处理服务器的设置方面经验不是很丰富。如果您要求我在命令行中使用20个参数启动GlassFish服务器,我将不得不了解这些参数的用途以及我应该设置多少参数,等等。
简而言之,当系统变得越来越大时,它可能会有越来越多的属性。通过预设系统属性,用户可能只需要在真正需要时知道自己是什么。例如,当我需要增加内存时,我只需要知道GlassFish的-XX:PermSize。
https://stackoverflow.com/questions/8653224
复制相似问题