【问题标题】:Apache Commons CLI : Getting list of values for an optionApache Commons CLI:获取选项的值列表
【发布时间】:2013-06-15 08:49:57
【问题描述】:

对于 CLI,我需要传入一个整数数组作为特定选项的输入。

示例 - 下面的命令将接收一个 customerIds 数组并执行一些操作。

myCommand -c 123 124 125

我已经使用 Apache commons CLI 实现了 CLI,并且我正在使用 getOptionValues("c") 来检索这个数组。

问题在于,这仅返回数组中的第一个元素,即 [123],而我希望它返回 [123, 124, 125]。

我的代码的精简版,

CommandLine cmd;
CommandLineParser parser = new BasicParser();
cmd = parser.parse(options, args);
if (cmd.hasOption("c")){
String[] customerIdArray = cmd.getOptionValues("c");
// Code to parse data into int
}

有人可以帮我找出这里的问题吗?

【问题讨论】:

    标签: java command-line-interface apache-commons


    【解决方案1】:

    我想在这里添加这个作为对@Zangdak 的回答,并添加我对同一问题的发现。

    如果您不调用#setArgs(int),则会发生 RuntimeException。当您知道此选项的确切最大参数数量时,请设置此特定值。当此值未知时,Option 类有一个常量:Option.UNLIMITED_VALUES

    这会改变 gerrytans 对以下内容的回答:

    Options options = new Options();
    Option option = new Option("c", "c desc");
    // Set option c to take 1 to oo arguments
    option.setArgs(Option.UNLIMITED_VALUES);
    options.addOption(option);
    

    【讨论】:

    • 是的,我做了什么,但我想得到一个更像下面的语法:cmd -opt1 { V1 V2 ... Vn } arg 但它似乎不存在,所以我只是将参数放在具有无限值的选项之前。
    • @Zangdok 如果我理解正确,这使我想到了同样的问题,那么 UNLIMITED_VALUES 在所有这些值之后有另一个选择是没有问题的。我可以确认,cmd --opt={V1 V2 ... Vn } -o --debug 之类的东西正在工作
    • 不,在具有无限值的选项之后的另一个选项效果很好。我想在这样的选择之后争论。不管怎样,我会试试你的语法。
    • 也可以使用OptionBuilder.hasArgs()
    【解决方案2】:

    您必须设置选项可以采用的最大参数值数量,否则它假定该选项只有 1 个参数值

    Options options = new Options();
    Option option = new Option("c", "c desc");
    // Set option c to take maximum of 10 arguments
    option.setArgs(10);
    options.addOption(option);
    

    【讨论】:

    • 如果参数值的最大数量未知?是否可以有带括号的语法?
    【解决方案3】:

    看起来我参加聚会有点晚了,但是 apache commons cli 进化了,现在(至少在 1.3.1 中)我们有一种新的方法来设置可以有无限数量的参数

    Option c = Option.builder("c")
            .hasArgs() // sets that number of arguments is unlimited
            .build();
            Options options = new Options();
            options.addOption(c);
    

    【讨论】:

    • 如果你调用 hasArgs() 那么 hasArg() 调用是多余的
    【解决方案4】:

    您必须指定两个参数setArgssetValueSeparator。然后你可以传递一个参数列表,比如-k=key1,key2,key3

    Option option = new Option("k", "keys", true, "Description");
    // Maximum of 10 arguments that can pass into option
    option.setArgs(10);
    // Comma as separator
    option.setValueSeparator(',');
    

    【讨论】:

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