Java:使用系统参数vs" regular"命令行选项

时间:2011-12-28 07:45:30

标签: java

让我们假设一个Java应用程序,接受一个整数命令行参数,比如bubu

假设有人使用了一个不错的命令行解析器(我做 - http://pholser.github.com/jopt-simple/)并且记住-D java开关,这些是传递此命令行参数的一些典型方法:

  1. --bubu 5(或--bubu=5--bubu5
  2. -Dbubu=5
  3. 第一个是程序参数,必须由应用程序使用某个命令行解析器处理,而第二个是VM参数,并且已经由java解析,使其可用Integer.getInteger("bubu")

    我有点疑惑。我该怎么用?使用系统属性工具:

    • 似乎没有任何费用
    • 不依赖于任何命令行解析器库
    • 提供方便(尽管意外)的API来获取值

    据我所知,唯一的缺点是所有命令行选项都必须使用-D标志。

    请,建议。

    感谢。

    修改

    系统参数的另一个优点 - “即使应用程序不是从主程序开始的独立应用程序,它们也可用,但当应用程序是webapp或单元测试时也是如此。” - 谢谢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给出了另一个原因,这对我来说非常好。

3 个答案:

答案 0 :(得分:11)

我认为Fortyrunner引用的优势实际上是对系统属性最显着的负面影响 - 任何要求它们的人都可以使用它们。

如果标志或选项是一个命令行选项,它应该可用于代码的层或模块,它处理从命令行获取输入,而不是任何要求它的代码。

您可以从全局状态获得一些破坏性耦合,系统属性与任何其他全局状态没有区别。

也就是说,如果你只是想制作一个快速而肮脏的CLI程序,并且关注点和耦合的分离对你来说不是一个大问题,系统属性会为你提供一个简单的方法,但不会导致(IMO) )糟糕的用户体验。一些getopt库将为您提供更多支持,以构建良好的CLI用户体验。

答案 1 :(得分:3)

系统属性的一个主要优点是它们可以在程序生命周期的任何时间使用。

命令行参数仅在main方法中可用(除非您保留它们)。

答案 2 :(得分:-1)

我觉得像我这样的普通用户不需要知道很多事情。系统属性将帮助系统开发人员预设许多值,以使系统能够运行。例如,当我下载GlassFish应用服务器时,它总是带有许多预设参数,我不知道它们的用途。我在处理服务器设置方面不是很有经验。如果你让我在命令行中启动带有20个参数的GlassFish服务器,我将不得不了解这些参数的用途以及我应该设置多少等等。这太麻烦了。

简而言之,当系统变得越来越大时,它可能会有越来越多的属性。预设系统属性后,用户可能只需要知道他们真正需要的内容。例如,当我需要增加内存时,我只需要了解GlassFish的-XX:PermSize

相关问题