【问题标题】:Apache Commons CLI - option type and default valueApache Commons CLI - 选项类型和默认值
【发布时间】:2011-07-31 22:25:41
【问题描述】:

如何为 CLI 选项指定类型 - 例如 intInteger? (后来,如何通过单个函数调用获取解析后的值?)

如何为 CLI 选项指定默认值?这样CommandLine.getOptionValue() 或上面提到的函数调用会返回该值,除非在命令行中指定了?

【问题讨论】:

    标签: java apache-commons apache-commons-cli


    【解决方案1】:

    CLI 不支持默认值。任何未设置的选项都会导致getOptionValue 返回null

    您可以使用Option.setType 方法指定选项类型,并使用CommandLine.getParsedOptionValue 将解析的选项值提取为该类型

    【讨论】:

    • 我知道 setType() 和 getParsedOptionValue() 的存在,但不知道如何使用它们。能给我举个小例子吗?
    【解决方案2】:

    编辑:现在支持默认值。请参阅下面的答案https://stackoverflow.com/a/14309108/1082541

    正如 Brent Worden 已经提到的,不支持默认值。

    我在使用 Option.setType 时也遇到了问题。在类型为Integer.class 的选项上调用getParsedOptionValue 时,我总是遇到空指针异常。因为文档没有真正的帮助,所以我查看了源代码。

    查看TypeHandler 类和PatternOptionBuilder 类可以看到Number.class 必须用于intInteger

    这是一个简单的例子:

    CommandLineParser cmdLineParser = new PosixParser();
    
    Options options = new Options();
    options.addOption(OptionBuilder.withLongOpt("integer-option")
                          .withDescription("description")
                          .withType(Number.class)
                          .hasArg()
                          .withArgName("argname")
                          .create());
    
    try {
        CommandLine cmdLine = cmdLineParser.parse(options, args);
    
        int value = 0; // initialize to some meaningful default value
        if (cmdLine.hasOption("integer-option")) {
            value = ((Number)cmdLine.getParsedOptionValue("integer-option")).intValue();
        }
    
        System.out.println(value);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    

    请记住,如果提供的数字不适合 intvalue 可能会溢出。

    【讨论】:

    • 感谢您的示例,这正是我所需要的。但是,我决定不使用 CLI:它的工作量太大。也许只有我一个人,但是当你必须处理这样的常见情况时,我发现它弄巧成拙。有了足够的设置代码,我应该可以只说 int foo = getOption("foo") 并在出现任何问题时将其默认为 42。
    • 是的,你是对的。我也认为图书馆应该处理这些东西。您可以推荐哪个选项解析库??
    • 我是 Java 世界的新手。这是我尝试的第一个,我不知道其他人。也许您应该将其作为问题发布?
    • 感谢您指出 Number.class 的事情。我天真地期望Integer.class 工作......!
    【解决方案3】:

    我不知道是不工作还是最近添加了,但getOptionValue() 一个接受默认(字符串)值的重载版本

    【讨论】:

    • 这正是我两年前所需要的 :)
    • @aib :很高兴它有帮助 - 它当时存在吗?
    • 我猜不是,否则我会看到的。 (或者至少这里的其他人。)
    【解决方案4】:

    OptionBuilder 在版本 1.3 和 1.4 中已弃用,Option.Builder 似乎没有直接设置类型的函数。 Option 类有一个名为setType 的函数。您可以使用函数CommandLine.getParsedOptionValue 检索转换后的值。 不知道为什么它不再是构建器的一部分。它现在需要一些这样的代码:

        options = new Options();
    
        Option minOpt = Option.builder("min").hasArg().build();
        minOpt.setType(Number.class);
        options.addOption(minOpt);
    

    并阅读它:

        String testInput = "-min 14";
        String[] splitInput = testInput.split("\\s+");
    
        CommandLine cmd =  CLparser.parse(options, splitInput);
        System.out.println(cmd.getParsedOptionValue("min")); 
    

    这将给出一个Long类型的变量

    【讨论】:

      【解决方案5】:

      可以用其他的定义

      getOptionValue:
      public String getOptionValue(String opt, String defaultValue)
      

      并将您的默认值包装成字符串。

      例子:

      String checkbox = line.getOptionValue("cb", String.valueOf(false));
      

      输出:假

      对我有用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-18
        • 2013-06-15
        • 2012-07-29
        • 1970-01-01
        • 2015-03-05
        • 1970-01-01
        • 2017-10-09
        • 1970-01-01
        相关资源
        最近更新 更多