Статьи

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

В этой четвертой части моей серии, посвященной синтаксическому анализу командной строки в Java, представлена командная строка , которая описывается как «библиотека Java для анализа аргументов командной строки», которая «основана на отображении аргументов командной строки на объекты с использованием аннотаций».

Как и ранее рассмотренные args4j и jbock , Commandline использует аннотации для «определения» потенциальных параметров командной строки. Однако, хотя args4j делает это с помощью аннотаций на полях класса, а jbock делает это с помощью аннотаций на конструкторе и его параметрах, Commandline использует аннотации на методах «set» (мутатор). В этом посте я использую пример класса Main как и в предыдущих постах, посвященных обработке командной строки на основе Java, но в обычных ситуациях я бы предпочел иметь специальный класс, представляющий аргументы командной строки.

Следующий листинг кода демонстрирует использование аннотаций командной строки в методах «get» для реализации этапа «определения» обработки командной строки в командной строке.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Main
{
   /** Is verbosity enabled? */
   private boolean verbose;
 
   /** Name/path of applicable file. */
   private String fileName;
 
   @Option
   @ShortSwitch("v")
   @LongSwitch("verbose")
   @Toggle(true)
   public void setVerbose(final boolean newVerbose)
   {
      verbose = newVerbose;
   }
 
   @Option
   @ShortSwitch("f")
   @LongSwitch("file")
   @SingleArgument
   @Required
   public void setFileName(final String newFileName)
   {
      fileName = newFileName;
   }

В приведенном выше листинге кода показано использование аннотации @Option строки @Option наряду с другими аннотациями, которые настраивают заданную опцию ( @ShortSwitch и @LongSwitch для коротких и длинных аргументов, @Required для обязательных аргументов, @SingleArgument для указания одного аргумента, связанного с switch, и @Toggle чтобы указать, что наличие или отсутствие переключателя является тем, что является значительным [без аргумента, связанного с этим переключателем]).

В следующем листинге кода демонстрируются этапы «синтаксического анализа» и «опроса» синтаксического анализа командной строки с помощью командной строки.

«Разбор» и «Опрос» с помощью командной строки

01
02
03
04
05
06
07
08
09
10
11
12
13
14
try
{
   // "Parsing" stage.
   final Main main = CommandLineParser.parse(
      Main.class, arguments, OptionStyle.LONG_OR_COMPACT);
 
   // "Interrogation" stage.
   out.println("You provided file name of '" + main.fileName
      + "' and verbose is set to '" + main.verbose + "'.");
}
catch (IllegalAccessException | InstantiationException | InvocationTargetException exception)
{
   out.println("ERROR: Unable to parse command-line arguments: " + exception);
}

Последний пример кода демонстрирует, что синтаксический анализ выполняется с помощью единственного CommandLineParser.parse(Class<T>, String[], OptionStyle) а опрос так же прост, как и доступ к членам экземпляра, возвращенного этим методом. Третий аргумент, предоставленный методу parse важен, потому что он инструктирует синтаксический анализатор, как ожидать появления переключателей.

В только что показанном примере кода используется OptionStyle.LONG_OR_COMPACT , который описывается в документации: «Длинные переключатели начинаются с двух тире. Короткие переключатели начинаются с одной черты и могут быть объединены в один ». Напротив, OptionStyle.SIMPLE инструктирует синтаксический анализатор ожидать, что «все переключатели должны быть автономными» и «все (как длинные, так и короткие) должны начинаться с одной черты в командной строке».

Следующий снимок экрана демонстрирует это простое приложение в действии.

Если обязательный аргумент не указан, отображается сообщение (включая трассировку стека), подобное показанному на следующем снимке экрана.

Я не привожу здесь пример использования справки или использования на основе командной строки, потому что, как говорится на странице проекта GitHub , «создание текста справки» — это «функциональность, которая в настоящее время не поддерживается».

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

  • Командная строка имеет открытый исходный код и лицензируется в соответствии с Apache License Version 2.0 .
  • Текущая версия командной строки ( 1.7.0 ) требует как минимум Java SE 7 .
  • Размер commandline-1.7.0.jar составляет приблизительно 38 КБ и не зависит от каких-либо дополнительных библиотек.

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

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