使参数在应用程序中可用

时间:2011-10-02 19:10:42

标签: java command-line-interface

存储命令行参数的标准方法是什么,以便在需要时可以访问它?

我可以看到两种情况:

  1. 立即消耗参数(记录级别)
  2. 不需要立即参数(失败时发送电子邮件到地址 X
  3. 使用方案1预先配置它似乎很自然,但是当它是场景2中的场景时,我更愿意在必要时配置该组件(IE不在前面)

    因此,为了使问题略有不同,如何使我的整个应用程序可以使用我的配置选项?

4 个答案:

答案 0 :(得分:2)

您可以拥有一个单独的Configuration对象,其中存储了所有相关内容。

public class Configuration {
  private static final Configuration conf = new Configuration();

  public static Configuration get() {
    return conf;
  }

  private String failureEmailAddress;
  public String getFailureEmailAddress() {
    return failureEmailAddress;
  }

  public void parseCommandLine(String[] args) {
    // ...
  }
}

答案 1 :(得分:1)

您可以使用类似的东西(您可以在某处存储命令行或立即使用选项):

Options options = createOptions();
CommandLineParser parser = new GnuParser();
CommandLine cmdLine;
int timeoutHumanMove;
try
{
    cmdLine = parser.parse(options, args, true);
    timeoutHumanMove = getTimeoutOption(cmdLine, "thm", 300);
}
catch(ParseException e)
{
    return;
}

private static int getTimeoutOption(CommandLine cmdLine, String opt, int defaultSeconds)
    throws ParseException
{
    if(cmdLine.hasOption(opt))
    {
        Number val = (Number)cmdLine.getParsedOptionValue(opt);
        return (int)(val.doubleValue() * 1000D);
    } else
    {
        return 1000 * defaultSeconds;
    }
}

private static Options createOptions()
{
    Options options = new Options();
    options.addOption(OptionBuilder.withDescription("print this help and exit").create(OptionBuilder.withLongOpt("help"), 104));

    // ...
    return options;
}

答案 2 :(得分:0)

没有标准的方法来存储您描述的应用程序范围的配置信息。但是,大多数情况下,您将它存储在特定于作业的类(ApplicationContext)中,然后将实例作为参数或构造函数或类似的东西传递给其他类。我通常使ApplicationContext不可变。

我遇到的一些应用程序使用静态全局上下文,实际上是一个全局变量。这不一定是个好主意,因为你应该避免使用全局变量。

但是,我会说你应该总是先验证命令行选项是否有效。您不希望进行3个小时的处理,然后发现有人没有在命令行上正确配置电子邮件地址。这应该是一个快速失败的情况。

答案 3 :(得分:-1)

您可以使用System.setProperty()将命令args存储到系统属性中,然后可以通过System.getProperty()在任何地方访问您的属性。