2013-06-18 30 views
25

对于CLI,我需要传入一个ints数组作为特定选项的输入。Apache Commons CLI:获取选项的值列表

示例 - 以下命令将采用一个customerIds数组并执行一些操作。

mycommand的-c 123 124 125

我已经使用Apache公地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 
} 

有人能帮助我在这里找到问题?

回答

24

你必须设置最大参数的数量值的选​​项可以拿,否则假定选项只有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

如果参数值的最大数量是未知的数量限制?是否有可能与\t括号有句法? – Zangdak

31

我想在这里添加为一个答案@Zangdak并在同一问题上添加我的发现。

如果您没有拨打#setArgs(int),则会发生RuntimeException。当您知道此选项的参数的确切最大数量时,请设置此特定值。当这个值是不知道,类选项都是有常数: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); 
+0

是的,这是我做的,但我想要得到一个语法如下:'cmd -opt1 {V1 V2 ... Vn} arg'但它似乎不存在,所以我只是将参数放在选项之前无限的价值。 – Zangdak

+1

@Zangdok如果我正确地理解了你,并将我带入相同的问题,UNLIMITED_VALUES在所有这些值之后都有另一个选项是没有问题的。 我可以证实,像'cmd --opt = {V1 V2 ... Vn} -o --debug'这样的东西正在工作 – VeikkoW

+0

不,在无限值的选项之后的另一个选项效果很好。我想在这样的选择之后有一个论点。无论如何,我会尝试你的语法。 – Zangdak

5

它看起来像我有点迟到了党,但阿帕奇公共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()调用是冗余的 – jnowakow

相关问题