Статьи

Интерфейсы командной строки Java (часть 6): JOpt Simple

Главная веб-страница для JOpt Simple называет эту библиотеку на основе Java «библиотекой Java для анализа параметров командной строки, например, тех, которые вы можете передать при вызове javac », «пытающихся соблюдать синтаксис параметров командной строки POSIX getopt ( ) и GNU getopt_long () . ” Это шестой пост из моей серии обработки аргументов командной строки в Java, в центре внимания которой находится JOpt Simple .

Большинство библиотек, которые я рассмотрел в этой серии обработки командной строки в Java, так или иначе используют аннотации. JOpt Simple, как и Apache Commons CLI , не использует аннотации. JOpt Simple поддерживает «свободные интерфейсы». Примеры и выводы этого исходного поста (списки кода) и выходные данные (снимки экрана) основаны на компиляции и работе с JOpt Simple 4.9, но они сработали для меня аналогично (и без изменений кода) при их компиляции и запуске с JOpt Simple 5.0.3. ,

Следующий листинг кода демонстрирует этап «определения» обработки командной строки с помощью JOpt Simple, и этот пример намеренно аналогичен тому, который использовался в предыдущих статьях по обработке командной строки в Java.

Определение параметров командной строки в JOpt Simple

1
2
3
4
5
6
7
final OptionParser optionParser = new OptionParser();
final String[] fileOptions = {"f", "file"};
optionParser.acceptsAll(Arrays.asList(fileOptions), "Path and name of file.").withRequiredArg().required();
final String[] verboseOptions = {"v", "verbose"};
optionParser.acceptsAll(Arrays.asList(verboseOptions), "Verbose logging.");
final String[] helpOptions = {"h", "help"};
optionParser.acceptsAll(Arrays.asList(helpOptions), "Display help/usage information").forHelp();

Этот листинг кода демонстрирует использование подхода «плавного API» для определения параметров командной строки. Создается экземпляр OptionParser, а затем для каждого потенциального параметра командной строки вызывается один из его перегруженных методов acceptsAll . Использование acceptptsAll позволяет нескольким именам флагов / опций связываться с одной опцией. Эта поддержка синонимов параметров позволяет использовать «-f» и «–file» для одной и той же опции.

Приведенный выше код демонстрирует, что параметр командной строки может быть указан в соответствии с требованиями .required() метода .required() . В этом случае требуется «файл». Если ожидается, что аргумент будет помещен в командную строку в сочетании с параметром / флагом, можно использовать метод withRequiredArg() . Параметр «help» в приведенном выше листинге кода использует метод forHelp() который сообщает JOpt Simple не генерировать исключение, если обязательный параметр отсутствует в командной строке, если параметр, связанный с forHelp() находится в командная строка. В моем примере это работает, чтобы гарантировать, что оператор может запустить приложение с -h или --help и без каких-либо других обязательных параметров и избежать возникновения исключения.

Страница Простые примеры использования JOpt предоставляет существенную информацию о множестве различных возможностей, доступных при определении параметров командной строки, и использует утверждения на основе JUnit, чтобы продемонстрировать, как эти разные тактики для определения параметров командной строки по-разному конфигурируют то, что анализируется. Мой листинг кода, показанный выше, показывает лишь небольшую часть того, что доступно. Обратите внимание, что комментарии Javadoc для класса OptionParser также содержат важные детали.

Приведенный выше код может быть еще более кратким, если кто-то статически импортирует Arrays.asList и передает имена потенциальных параметров командной строки в виде строк непосредственно этому методу asList (String…) вместо использования подхода, который я использовал для создания массива строк. сначала, а затем преобразовать их в список. Я использовал этот подход в этой вводной статье, чтобы было очень ясно, что происходит, но вполне вероятно, что версия кода, связанная с этим сообщением на GitHub, будет изменена для использования подхода статического импорта .

Этап «синтаксического анализа» обработки командной строки с помощью JOpt Simple, ну, в общем, прост:

1
final OptionSet options = optionParser.parse(arguments);

«Разбор» с JOpt Simple влечет за собой вызов метода OptionParser.parse (String…)

Этап «допрос» обработки командной строки с помощью JOpt Simple также прост и продемонстрирован в следующем листинге кода.

1
out.println("Will write to file " + options.valueOf("file") + " and verbosity is set to " + options.has("verbose"));

Одна строка кода демонстрирует, что опрос состоит из вызова удобных методов для экземпляра OptionSet, возвращаемого вызовом синтаксического анализа. В этом случае двумя демонстрационными методами, вызываемыми в OptionSet являются OptionSet.valueOf (String) и OptionSet.has (String) .

JOpt Simple также поддерживает автоматическую генерацию оператора use / help. Следующий листинг кода демонстрирует это.

1
optionParser.printHelpOn(out);

В только что показанной строке кода записывается информация об использовании / справке, сгенерированная экземпляром OptionParser в выходной поток, предоставленный ему через метод printHelpOn (OutputStream) .

С наиболее значимым кодом, необходимым для применения JOpt Simple, пришло время посмотреть, как ведет себя простое приложение, использующее этот код. На следующих снимках экрана показан код в действии. Первый снимок экрана демонстрирует исключение MissingRequiredOptionsException, которое выводится, когда не указана требуемая опция командной строки «file».

Следующий снимок экрана демонстрирует указание опций «file» и «verbose» в командной строке.

Сообщение об автоматическом использовании / помощи, предоставляемое JOpt Simple, демонстрируется на следующем снимке экрана.

Вот некоторые дополнительные характеристики интерфейса командной строки Apache Commons, которые следует учитывать при выборе платформы или библиотеки, которые помогут при синтаксическом анализе командной строки в Java.

  • JOpt Simple имеет открытый исходный код и распространяется по лицензии MIT .
  • На момент написания этой статьи последние версии JOpt Simple — 5.0.3 и 6.0 Alpha 1; JOpt Simple 4.9 (последняя версия, в настоящее время перечисленная в журнале изменений JOpt Simple и версия, показанная в примере зависимостей Maven ), использовалась в этом посте.
  • Размер jopt-simple-4.9.jar составляет приблизительно 65 КБ, и он не имеет зависимостей времени компиляции от каких-либо сторонних библиотек.
  • JOpt Simple был или используется несколькими влиятельными библиотеками и фреймворками. К ним относятся Spring Framework (необязательная зависимость компиляции) и JMH (зависимость компиляции).
    • На главной странице веб-страницы JOpt Simple цитируется Марк Рейнхольд : «Я подумал, что вам может быть интересно узнать, что мы используем вашу простую библиотеку jopt в наборе Java Development Kit с открытым исходным кодом. Спасибо за написание такой миленькой библиотеки! Это намного чище, чем любая другая альтернатива ».
  • JOpt Simple был доступен в течение нескольких лет, но, похоже, все еще поддерживается (последняя версия Maven Central — декабрь 2016 года).
  • JOpt Simple не использует аннотации и использует текущие вызовы API.
  • JOpt Simple поддерживает отношения между параметрами командной строки, такими как обязательные зависимые параметры .

Обычно это положительный признак полезности библиотеки, когда другие хорошо принятые и полезные инструменты и библиотеки используют эту библиотеку. Выбор JOpt Simple в качестве библиотеки обработки командной строки для некоторых таких инструментов и библиотек определенно говорит о JOpt Simple. JOpt Simple предоставляет полезную и мощную альтернативу Apache Commons CLI для тех, кто предпочитает обработку в командной строке Java без аннотаций. JOpt Simple предоставляет значительно больше возможностей, чем показано в этом посте, и эту возможность лучше всего обнаружить, прочитав « обзор функций JOpt Simple» на основе модульного теста.

Дополнительные ссылки