37

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

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

我的命令-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
}

有人可以帮我确定这里的问题吗?

4

4 回答 4

51

我想在这里添加这个作为对@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);
于 2014-07-10T12:12:41.080 回答
44

您必须设置选项可以采用的最大参数值的数量,否则它假定该选项只有 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);
于 2013-06-19T00:00:59.160 回答
16

看起来我参加聚会有点晚了,但是 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);
于 2017-02-20T08:26:07.900 回答
5

您必须指定两个参数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(',');
于 2019-02-01T14:01:43.680 回答