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
}
Может кто-нибудь помочь мне определить проблему здесь?
Ответы
Ответ 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(',');