Apache Commons CLI:获取选项的值列表

41

为了一个命令行界面(CLI),我有一个要求需要将整数数组作为特定选项的输入传递。

例如 - 下面的命令将接受一个customerId数组并执行一些操作。

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
}

有人能帮我识别这里的问题吗?

4个回答

55

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

如果您不调用#setArgs(int),那么将会导致运行时异常。当您知道此选项的实际最大参数数量时,请设置此特定值。当不知道此值时,类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,但似乎不存在,所以我只是将参数放在具有无限值的选项之前。 - Zangdak
1
@Zangdok 如果我理解你的意思是,这也让我产生了同样的问题,那么对于 UNLIMITED_VALUES 来说,在所有这些值之后再有另一个选项是没有问题的。 我可以确认,像 cmd --opt={V1 V2 ... Vn } -o --debug 这样的命令是可行的。 - VeikkoW
没有,一个参数可以接受无限个值的选项后面还有另一个选项是可行的。我想在这样的选项之后再加一个参数。不过,我会尝试你提供的语法。 - Zangdak
2
你也可以使用OptionBuilder.hasArgs()。 - Chase

45

你必须设置选项可以接受的参数值的最大数目,否则它会默认该选项只有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);

11
如果参数值的最大数量未知,是否可以使用带括号的语法? - Zangdak

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);

1
如果您已调用 hasArgs(),那么调用 hasArg() 就是多余的。 - Kuba

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(',');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接