Apache Commons CLI:获取选项的值列表
Posted
技术标签:
【中文标题】Apache Commons CLI:获取选项的值列表【英文标题】:Apache Commons CLI : Getting list of values for an option 【发布时间】: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
有人可以帮我找出这里的问题吗?
【问题讨论】:
【参考方案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】:您必须指定两个参数setArgs
和setValueSeparator
。然后你可以传递一个参数列表,比如-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(',');
【讨论】:
以上是关于Apache Commons CLI:获取选项的值列表的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop NoSuchMethodError apache.commons.cli
Apache Commons CLI 中的 DefaultParser