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.