Может ли анализатор параметров Apache Commons CLI игнорировать неизвестные параметры командной строки?
Я пишу приложение Java, которое принимает аргументы командной строки, которые обрабатываются с помощью Apache Commons CLI с помощью GnuParser. По причинам, которые не интересны для ввода, я хотел бы, чтобы он молча игнорировал неизвестные параметры командной строки вместо того, чтобы бросать ParseException, но я не вижу способа сделать это. Я вижу, что в GnuParser.parse() есть опция bAnNoOption boolean, но то, что я хочу, больше похоже на ignoreAtNonOption, где она будет продолжать обрабатывать параметры после обнаружения неизвестного токена.
Я мог бы реализовать свой собственный синтаксический анализатор, чтобы выполнить это, но я удивлен, что встроенная функция не создана, поэтому я решил проверить, прежде чем идти по этой дороге.
Пример кода, о котором я говорю:
try {
CommandLine commandLine = parser.parse(options, args);
// stopAtNonOption set to true (below) is also not what I want
// CommandLine commandLine = parser.parse(options, args, true);
} catch (ParseException e) {
LOG.error("error parsing arguments", e);
throw new RuntimeException(e);
}
Ответы
Ответ 1
Это работает для меня (также могут быть выведены и другие парсеры):
public class ExtendedGnuParser extends GnuParser {
private boolean ignoreUnrecognizedOption;
public ExtendedGnuParser(final boolean ignoreUnrecognizedOption) {
this.ignoreUnrecognizedOption = ignoreUnrecognizedOption;
}
@Override
protected void processOption(final String arg, final ListIterator iter) throws ParseException {
boolean hasOption = getOptions().hasOption(arg);
if (hasOption || !ignoreUnrecognizedOption) {
super.processOption(arg, iter);
}
}
}
Ответ 2
Это невозможно с помощью Commons CLI. Но может быть другой способ добиться результата, которого вы ожидаете, если вы дадите более подробную информацию о вашем случае использования.
Ответ 3
Я очень плохой разработчик, и я делаю это, чтобы разбить код:
public class EasyPosixParser extends PosixParser {
@Override
protected void processOption(String arg, ListIterator iter) throws ParseException
{
try {
super.processOption(arg, iter);
} catch (ParseException e) {
// do nothing
}
}
}
в вашем основном коде, вы делаете:
CommandLineParser commandlineParser = new EasyPosixParser();