Статьи

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

В этой статье описывается использование CmdLn (анализатора командной строки Java) Ostermiller Java Utilities 1.08.02 для обработки аргументов командной строки из приложений на основе Java. Утилиты Ostermiller Java включают в себя несколько различных типов утилит , но этот пост посвящен «анализатору командной строки», который описан на странице компонентов , «Обработка параметров и аргументов для программ командной строки Java».

Синтаксический анализатор командной строки Ostermiller Utilities не использует аннотации, но вместо этого использует программный компоновщик с гибкой концепцией API, которую некоторые другие библиотеки синтаксического анализа на основе Java также используют вместо аннотаций. Классы com.Ostermiller.util.CmdLn и com.Ostermiller.util.CmdLnOption используются вместе на этапе «определения» обработки командной строки с помощью CmdLn. Это продемонстрировано в следующем листинге кода.

Этап «Определение» обработки CmdLn

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public static void main(final String[] arguments)
{
   final CmdLn cmdLn
      = new CmdLn(arguments).setDescription("Demonstrates CmdLn")
         .addOptions(new CmdLnOption[]{
            new CmdLnOption("help",'h'),
            new CmdLnOption("file",'f')
               .setRequiredArgument()
               .setArgumentBounds(1, 1)
               .setDescription("Path and name of file"),
            new CmdLnOption("verbose", 'v')
               .setOptionalArgument()
               .setArgumentBounds(0, 0)
               .setDescription("Enable verbosity")
         });

В только что показанном листинге кода определены три варианта. Один параметр — это параметр «справки», а два других параметра ( -h / --help и -v / --verbose ) — это те, которые используются в других статьях этой серии при разборе командной строки в Java. Код демонстрирует, что описание может быть задано для каждого варианта использования / справочной информации, и можно указать, является ли каждый параметр обязательным или необязательным. Метод setArgumentBounds(int,int) используется для указания минимального и количества аргументов, ожидаемых для каждого параметра. Опция файла всегда должна иметь один и только один аргумент (путь и имя файла), поэтому его минимум и максимум равны 1. Параметр многословия не должен иметь аргументов (его наличие означает, что многословие включено), поэтому его минимальное и максимальное число аргументов оба 0.

Синтаксический анализатор командной строки Ostermiller Java Utilities предоставляет три подхода для «определения» того, что должно быть проанализировано. Подход, показанный выше, называется подходом «Опции по имени» на странице CmdLn . На этих страницах также показано определение параметров командной строки для анализа с использованием подходов «Option Enum» и «Call Back to Listeners» (не показано в этом посте).

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

Этап «опрос» реализуется путем вызова одного из перегруженных методов getResult () в экземпляре CmdLn . Если перегруженный getResult(-) возвращает значение null , параметр отсутствует (или не найден во время анализа). Если этот перегруженный метод возвращает null значение, это значение будет иметь тип CmdLnResult и представляет проанализированный параметр. Этот возвращенный экземпляр CmdLnResult предоставляет методы для доступа к аргументу или аргументам, связанным с параметром (например, к пути и имени файла опции -f / --file в моем примере). Этот «опрос» демонстрируется в следующем листинге кода.

Этап «Допрос» с CmdLn

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(cmdLn.getResult('h') != null)
{
   cmdLn.printHelp();
   System.exit(0);
}
 
String fileName = null;
if(cmdLn.getResult('f') != null)
{
   fileName = cmdLn.getResult('f').getArgument();
}
else
{
   out.println("Required parameter -f|--file not provided.\n" + cmdLn.getHelp());
   System.exit(-1);
}
 
boolean verbose = false;
if (cmdLn.getResult('v') != null)
{
   verbose = true;
}
out.println("File path/name is " + fileName + " and verbosity is set to " + verbose);

Класс CmdLn также имеет методы getResult s которые возвращают List<CmdLnResult> для доступа к нескольким анализируемым параметрам. Приведенные выше примеры демонстрируют проверку результатов getResult() метода getResult() для null чтобы определить, установлена ​​опция или нет. Полный исходный код Java-приложения, используемого для этого поста, доступен на GitHub и использует CmdLn.present (char) вместо null проверок для определения наличия опции. Различия можно увидеть здесь .

Синтаксический анализатор командной строки Ostermiller Java Utilities не требует явного вызова «синтаксического анализа». Вместо этого ранее обсуждавшиеся методы «опроса» (перегруженные версии getResult и getResults ) неявно анализируют при вызове. Каждый из этих методов вызывает public метод CmdLn.parse () , но на самом деле синтаксический анализ происходит только для первого вызванного, потому что экземпляр анализирует boolean значение, которое сообщает этому экземпляру, что ему не нужно повторно анализировать при последующих вызовах методов getResult или getResults ,

Следующие три снимка экрана демонстрируют использование этого простого Java-приложения с использованием анализатора командной строки Ostermiller Java Utilities. Первое изображение отображает выходные данные, когда не указаны аргументы (включая обязательный аргумент пути / имени файла) Второе изображение отображает выходные данные справки / использования, сгенерированные, когда указана опция --help или -h и показывает, что в этом случае отсутствует сообщение об ошибке отсутствующего параметра. Третий снимок экрана демонстрирует выполнение «счастливого пути» простого приложения с использованием кратких и длинных форм файла и параметров многословия.

Вот некоторые дополнительные характеристики Ostermiller Java Utilities CmdLn, которые следует учитывать при выборе каркаса или библиотеки, чтобы помочь с анализом командной строки в Java.

  • Утилиты Ostermiller Java, в состав которых входит CmdLn, имеют открытый исходный код, а Лицензия OstermillerUtils является Стандартной общественной лицензией GNU версии 2 (GPL). Часто задаваемые вопросы о лицензии com.Ostermiller.util объясняют, почему была выбрана лицензия GPL, и стремление избежать использования этих библиотек в приложениях с закрытым исходным кодом.
  • CmdLn является частью большей Java-утилиты Ostermiller, которая доступна в виде единого JAR-файла. Размер ostermillerutils-1.08.02.jar составляет приблизительно 272 КБ, и сторонние JAR-файлы не требуются (никаких других внешних зависимостей).
  • Для использования Ostermiller Java Utilities требуется J2SE 5 или более поздняя версия.
  • Утилиты Ostermiller Java не видели обновлений в последние годы, но История версий подробно описывает долгосрочную доступность этих утилит.

Часть синтаксического анализатора командной строки Java Utilities Ostermiller достаточно проста в использовании для базового анализа командной строки и выполняет свою работу. Однако у Ostermiller Java Utilities есть более ограничительная лицензия, чем у большинства библиотек обработки командной строки на основе Java с открытым исходным кодом, обсуждаемых в этой серии. Кроме того, необходимо включить весь JAR-файл Ostermiller Java Utilities, чтобы получить функциональность обработки командной строки, что может показаться немного тяжелым для некоторых простых приложений, запускаемых из командной строки. Я считаю, что утилита синтаксического анализа командной строки, предоставляемая Ostermiller Java Utilities, будет наиболее привлекательной для разработчиков, чьи приложения уже используют утилиты Ostermiller Java для других предоставляемых им утилит.

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