25

Я пишу приложение командной строки в Java, и я выбрал Apache Commons CLI для анализа входных аргументов.Commons CLI обязательные группы

Предположим, у меня есть две требуемые опции (т.е. -вход и выход). Я создаю новый объект Option и устанавливаю требуемый флаг. Пока все хорошо. Но у меня есть третий, необязательный вариант, т.е. -Помогите. С настройками, которые я упомянул, когда пользователь хочет показать справку (используйте параметр -help), он говорит: «-вход и выход» требуются. Есть ли способ реализовать это (через Commons CLI API, а не просто, если (! HasOption) throw new XXXException()).

ответ

27

В этой ситуации вы должны определить два набора параметров и разобрать командную строку дважды. Первый набор опций содержит параметры, предшествующие требуемой группе (обычно --help и --version), а второй набор содержит все параметры.

Вы начинаете с разбора первого набора параметров, и если совпадение не найдено, вы продолжаете второй набор.

Вот пример:

Options options1 = new Options(); 
options1.add(OptionsBuilder.withLongOpt("help").create("h")); 
options1.add(OptionsBuilder.withLongOpt("version").create()); 

// this parses the command line but doesn't throw an exception on unknown options 
CommandLine cl = new DefaultParser().parse(options1, args, true); 

if (!cl.getOptions().isEmpty()) { 

    // print the help or the version there. 

} else { 
    OptionGroup group = new OptionGroup(); 
    group.add(OptionsBuilder.withLongOpt("input").hasArg().create("i")); 
    group.add(OptionsBuilder.withLongOpt("output").hasArg().create("o")); 
    group.setRequired(true); 

    Options options2 = new Options(); 
    options2.addOptionGroup(group); 

    // add more options there. 

    try { 
     cl = new DefaultParser().parse(options2, args); 

     // do something useful here. 

    } catch (ParseException e) { 
     // print a meaningful error message here. 
    } 
} 
+0

ОК. Но как я могу сказать, что я не нашел матч? ("и если совпадение не найдено")? Если я устанавливаю обязательный флаг, я получаю ParseExeception, но когда я передаю параметр, который недоступен, я также получаю ParseException :(Как я могу отличить эти случаи? – pavel

+0

Вы знаете, если вы получили совпадение, когда 'commandline.getOptions()' isn ' t empty –

+0

Ok. Это возможное решение. Но как насчет обработки неподдерживаемых опций? Доступны следующие опции: -help, -input, -output. User puts -test. Затем мне нужно проверить первый набор (с помощью HELP), чтобы определить, был найден или нет.Если не было или UnrecognizedOptionException было брошено, то мне нужно проанализировать второй набор параметров? Просто попробуйте {parsefirstSet() if (not_found) parseSecondSet() catch (ParserException) {parseSecondSet()}? Я что-то пропустил или это то, что вы предложили. Спасибо за помощь. btw :) – pavel