Подтвердить что ты не робот

Apache Commons CLI: получение списка значений для опции

Для CLI у меня есть требование передать в массиве int в качестве входных данных для определенного параметра.

Пример. Команда ниже принимает массив customerIds и выполняет некоторые операции.

myCommand -c 123 124 125

Я реализовал CLI, используя CLI Apache commons, и я использую 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
}

Может кто-нибудь помочь мне определить проблему здесь?

4b9b3361

Ответ 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);

Ответ 2

Я хотел бы добавить это здесь как ответ на @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);

Ответ 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);

Ответ 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(',');