Apache Commons CLI 1.3.1: Как игнорировать неизвестные аргументы?
Раньше я работал с Apache Commons Cli 1.2. Я хотел, чтобы анализатор игнорировал аргументы, если они неизвестны (не добавлены в Options-Object).
Пример (псевдокод):
Options specialOptions;
specialOptions.addOption(null, "help", false, "shows help");
specialOptions.addOption(null, "version", false, "show version");
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args); //no third argument, since i dont want the program to stop parsing.
// run program with args: --help --unknown --version
// program shall parse --help AND --version, but ignore --unknown
Я использовал это решение Паскаля Шефера: может ли анализатор параметров командной строки Apache Commons игнорировать неизвестные параметры командной строки?
Это работало хорошо для меня на 1.2, и это прекрасно работает и на 1.3.1. Но его не рекомендуется. Парсер, который я использовал, был заменен на DefaultParser
. Я посмотрел функциональные возможности, но нет такого метода processOptions
.
Я действительно хотел бы использовать код, который не будет удален в более поздних выпусках. У кого-нибудь есть идеи, как решить эту проблему?
Ответы
Ответ 1
Это должно работать для вашего варианта использования:
Options options = new Options();
CommandLine commandLine = new DefaultParser().parse(options, args, true);
Важной частью для вас является stopAtNonOption: true
:
Флаг, указывающий, как обрабатываются нераспознанные токены. Значение true, чтобы остановить анализ и добавить оставшиеся токены в список аргументов. ложь, чтобы бросить исключение.
Документы по адресу https://commons.apache.org/proper/commons-cli/javadocs/api-1.3.1/org/apache/commons/cli/DefaultParser.html#stopAtNonOption
Ответ 2
Здесь можно использовать тот же подход, что и в решении Паскаля.
public class RelaxedParser extends DefaultParser {
@Override
public CommandLine parse(Options options, String[] arguments) throws ParseException {
List<String> knownArguments = new ArrayList<>();
for (String arg : arguments) {
if (options.hasOption(arg)) {
knownArguments.add(arg);
}
}
return super.parse(options, knownArguments.toArray(new String[knownArguments.size()]));
}
}
Или, в качестве альтернативы, удалите неизвестные параметры из аргументов, как указано выше, и используйте DefaultParser.