Статьи

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

На главной странице GitHub Jargo определен как «инструмент, облегчающий обработку аргументов / опций программы». Эта страница предоставляет обоснование для другой библиотеки обработки командной строки, когда уже существует так много других, и верхняя часть этого списка: «Потому что безопасность типов, неизменность и удобочитаемость имеют значение».

Этап «определения» параметров Jargo использует типизированные экземпляры класса Argument . Эти экземпляры Argument создаются с помощью статических методов в классе Arguments, чтобы установить тип, а затем с помощью методов в стиле построителя, чтобы описать опцию. Это демонстрируется на следующем снимке экрана, который показывает определение параметров пути / имени файла и многословия (полный список кодов доступен на GitHub ).

Этап «Определение» с Ярго

01
02
03
04
05
06
07
08
09
10
11
12
13
final Argument<String> filePathAndName
   = stringArgument().description("Path and name of file.")
                     .names("--file", "-f")
                     .required()
                     .build();
// Use optionArgument() instead of booleanArgument() to avoid need
// to specify true or false as arguments to --verbose/-v option
final Argument<Boolean> verbose
   = optionArgument("--verbose", "-v")
                    .description("Enables verbosity.")
                    .names("--verbose", "-v")
                    .defaultValue(false)
                    .build();

Показанные выше методы stringArgument() и optionArgument() вызываются для статически импортированного (не показан) класса Arguments . Метод optionArgument() необходимо было использовать для флага многословия, чтобы избежать необходимости явно указывать true или false после флага многословия.

Этап «синтаксического анализа» реализуется с помощью класса CommandLineParser и его свободно используемых методов API, как показано в следующем листинге кода.

1
2
3
final ParsedArguments parsedArguments
   = CommandLineParser.withArguments(filePathAndName, verbose)
                      .parse(arguments);

Экземпляр ParsedArguments, предоставленный CommandLineParser можно использовать для этапа «опроса». Это достигается путем вызова метода «get» для экземпляра ParsedArguments и передачи ему соответствующего экземпляра Argument . Следующий листинг кода демонстрирует это.

Этап «Допрос» с Ярго

1
2
out.println("File path/name is '" + parsedArguments.get(filePathAndName)
   + "' and verbosity is set to '" + parsedArguments.get(verbose) + "'.");

На следующих снимках экрана показано использование Jargo. Первый снимок экрана демонстрирует трассировку стека исключений, которая происходит, когда не указан обязательный параметр, а второй снимок экрана демонстрирует используемые длинные и короткие имена параметров.

Трассировка стека, показанная на первом снимке экрана, не является наилучшим способом уведомления пользователя о том, что не указан обязательный параметр. Jargo позволяет возвращать более приятное сообщение, перехватывая ArgumentException и вызывая его метод getMessageAndUsage() . Код для этого можно увидеть на GitHub, а результаты показаны на следующем снимке экрана.

Снимок экрана демонстрирует, что отображается информация, представленная в экземпляре Argument s. Jargo также позволяет явно генерировать исключение для предоставления этой информации, когда указан аргумент «help». Это использует статический метод helpArgument() в классе Arguments и пример его использования включен в листинг кода GitHub .

Есть особенности Jargo, которые следует учитывать при выборе фреймворка или библиотеки, чтобы помочь с анализом командной строки в Java.

  • Jargo имеет открытый исходный код и распространяется по лицензии Apache, версия 2.0 .
  • Jargo- jargo-0.4.1.jar имеет размер приблизительно 177 КБ, но во время выполнения зависит от гораздо большей библиотеки Guava .
    • Зависимость от Гуавы — это намеренное решение, как описано в Обосновании Жарго : «Потому что я люблю Гуаву и хотел, чтобы библиотека разбора аргументов была хорошо интегрирована с ней (подробнее об этом в этом разделе)».
    • Это, очевидно, не проблема для многих приложений, которые используют Guava, но может быть проблемой для тех, кто хочет использовать командную строку для обработки библиотеки на основе Java для простого приложения, которое иначе не использует Guava.
  • Jargo использует строго типизированные вызовы API для программной настройки ожидаемых параметров командной строки вместо использования аннотаций и / или отражения.
  • В области, где доступно так много библиотек обработки командной строки на основе Java, Jargo, скорее всего, станет важным претендентом на роль разработчика, который хочет получить все атрибуты библиотеки обработки командной строки, которые Jargo’s Rationale перечисляет в объяснении, почему другая библиотека в это многолюдное пространство было развито.

Jargo — это простая в использовании библиотека для обработки параметров командной строки в Java, которая использует классы общего типа и статические методы, специфичные для типа, для обеспечения безопасности типов параметров командной строки. Jargo требует, чтобы Guava запускался, и поэтому лучше всего подходит для приложений, уже использующих Guava. Разработчик, скорее всего, серьезно рассмотрит Jargo над другими альтернативными библиотеками обработки командной строки на основе Java, если все элементы Jargo Rationale важны для этого разработчика.

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