web-dev-qa-db-ja.com

Apache Commons CLI:オプションの値のリストを取得する

CLIの場合、特定のオプションの入力として整数の配列を渡す必要があります。

例-以下のコマンドは、customerIdの配列を受け取り、いくつかの操作を実行します。

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
}

ここで問題を特定するのを手伝ってくれる人はいますか?

32
Gautham Reddy

オプションが取ることができる引数値の最大数を設定する必要があります。そうでない場合、オプションは引数値が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);
35
gerrytan

これを@Zangdakへの回答としてここに追加し、同じ問題に関する私の発見を追加したいと思います。

#setArgs(int)を呼び出さないと、RuntimeExceptionが発生します。このオプションの引数の最大数がわかっている場合は、この特定の値を設定します。この値が不明な場合、クラスOptionには定数があります:Option.UNLIMITED_VALUES

これにより、ゲリタンの回答が次のように変わります。

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

私はパーティーに少し遅れているように見えますが、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);
9

2つのパラメーター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(',');
0
ReaktorDTR