Может ли анализатор параметров 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();