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】:

您必须指定两个参数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(',');

【讨论】:

以上是关于Apache Commons CLI:获取选项的值列表的主要内容,如果未能解决你的问题,请参考以下文章

Apache Commons CLI

Hadoop NoSuchMethodError apache.commons.cli

Apache Commons CLI 中的 DefaultParser

Apache Commons CLI 开发工具(CommandLineParserPosixParser)

Apache Commons CLI 开发命令行工具示例

Apache Commons:CLi的简单的使用(创建mysql的访问器)