Статьи

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

Избранная библиотека для моего двенадцатого поста по обработке аргументов командной строки в Java — это Аргументы командной строки с отражением Java (CLAJR). Эта «библиотека» представляет собой единственный исходный файл Java ( CLAJR-0.9.java ), доступный для загрузки на SourceForge . На главной странице CLAJR в настоящее время указана дата авторского права 2006 года, а загружаемый исходный zip-файл CLAJR-0.9-src.zip датирован 6 декабря 2008 года. Хотя в последние годы CLAJR, по-видимому, в основном не поддерживается, и хотя вряд ли я бы выбрал CLAJR Я полагаю, что в отношении некоторых альтернативных библиотек, уже обсуждавшихся в этой серии, для обработки аргументов командной строки из кода Java, CLAJR гарантирует публикацию, посвященную этому вопросу. Есть некоторые довольно уникальные характеристики CLAJR, которые делают его интересным, даже если кто-то решит его не использовать.

CLAJR не предоставляется в качестве JAR. Вместо этого он предоставляется в виде одного сжатого файла с одним файлом исходного кода Java, содержащимся в этом файле ZIP. Доступность в виде одного файла исходного кода не является уникальной для CLAJR; Picocli также предоставляется в одном файле исходного кода Java. Тем не менее, Picocli также делает JAR доступным в репозитории Maven (который я использовал при работе с Picocli), но я не знаю о готовом JAR с соответствующими файлами .class для CLAJR. Поэтому, поскольку я предпочитаю JAR файлу с исходным кодом при использовании сторонних библиотек, первое, что я сделал, экспериментируя с CLAJR, было встраивание предоставленного исходного кода в небольшой файл JAR.

Вот шаги, которые я использовал для создания JAR с CLAJR (мне пришлось внести небольшое изменение в исходный файл, и это изменение будет описано далее в этом посте):

  1. Загрузите CLAJR-0.9-src.zip с SourceForge .
  2. Разархивируйте CLAJR-0.9-src.zip, чтобы извлечь CLAJR-0.9.java .
  3. Создайте каталог clajr для представления пакета Java clajr , в котором должен существовать исходный класс Java.
  4. Переместите файл CLAJR-0.9.java в каталог clajr и переименуйте его в CLAJR.java, чтобы он соответствовал имени класса в этом исходном файле.
    • Мне также пришлось отредактировать исходный код, чтобы внести незначительные изменения; это обсуждается более подробно позже в посте.
  5. Используйте javac для компиляции файла CLAJR.java в несколько файлов классов.
  6. Используйте jar для сборки скомпилированных файлов .class в JAR (я назвал его CLAJR-0.9.jar ).

Вышеуказанные шаги проиллюстрированы на следующих двух снимках экрана.

Библиотеки синтаксического анализа командной строки, основанные на Java, которые мы рассматривали до сих пор в этой серии, обычно используют аннотации или специальные программные API-интерфейсы для определения, анализа и опроса аргументов командной строки в коде Java. CLAJR, как предполагает его полное имя, вместо этого использует отражение Java для определения ожидаемых аргументов для анализа.

Главная страница CLAJR описывает, почему автор выбрал отражение имен методов для определения аргументов командной строки. CLAJR ищет методы, имена которых соответствуют параметру или параметрам, которые обрабатываются. Одно подчеркивание предшествует имени метода для аргумента командной строки с одним дефисом, в то время как двойное подчеркивание предшествует имени метода для аргумента командной строки с двойным дефисом. Один метод может быть назван для выравнивания с несколькими аргументами командной строки, когда несколько аргументов командной строки делают одно и то же.

Как и в других статьях этой серии, мой пример для этой статьи демонстрирует использование библиотеки CLAJR для моделирования аргументов командной строки --file / -f и аргументов командной строки --verbose / -v . Чтобы «определить» их в CLAJR, мне нужно назвать мои методы _f__file и _v__verbose чтобы они соответствовали аргументам -f / --file и -v / --verbose . Это продемонстрировано в частичном фрагменте вложенного класса Options в следующем листинге кода.

Этап «Определение» в CLAJR: отражение

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
/**
 * Used reflectively by CLAJR to parse and interrogate command line
 * options defined as fields in this class.
 */
public static class Options
{
   private String file;
   private boolean verbose;
 
   public void _v__verbose()
   {
      verbose = true;
   }
 
   public void _f__file(String newFilePathAndName)
   {
      file = newFilePathAndName;
   }

Разбор с CLAJR — это вопрос одного утверждения. Следующие две строки кода демонстрируют вызов статического CLAJR.parse(String[], Object...) и передачу ему аргументов командной строки и только что созданного экземпляра класса Options частично показанного выше.

Этап «Парсинга» в CLAJR

1
2
final Options options = new Options();
CLAJR.parse(arguments, options);

В показанном выше анализе одной строки возвращаемое значение из метода parse . Вместо этого переданный экземпляр «options» заполняет свои поля в соответствии с аргументами, указанными в командной строке. CLAJR использует отражение в методах экземпляра «options» для поиска методов, вызываемых при обнаружении соответствующих аргументов в командной строке. Именно этот экземпляр Options можно «опросить», чтобы найти значения аргументов в командной строке. Это продемонстрировано в следующем листинге кода.

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

1
2
out.println("File is '" + options.getFile() + "' and verbosity is set to '"
   + options.isVerbose() + "'.");

CLAJR поддерживает предоставление справочной информации / информации об использовании для каждого метода путем рефлексии. В этом случае методы называются с соглашением, аналогичным тем, которые используются для самих аргументов командной строки, но с help перед именем метода. Это продемонстрировано для двух комбинаций аргументов, показанных ранее в следующем листинге кода.

Методы CLAJR «Помощь»

1
2
3
4
5
6
7
8
9
public String help_v__verbose()
{
   return "Enables verbosity of output.";
}
 
public String help_f__file()
{
   return "Path and name of file.";
}

Методы в приведенном выше листинге кода предоставляют строки «help» для аргументов -v / --verbose и -f / --file . Статический метод CLAJR Метод CLAJR.getHelp() предоставляет String представляющую использование командной строки на основе этих методов. CLAJR предоставляет различные исключения, которые могут быть зафиксированы, и они часто полезны в сочетании с методами «помощи». Они продемонстрированы в следующем листинге кода, который показывает несколько перехватов, которые могут быть выполнены, связанные с различными случаями ошибок и другими ситуациями, которые требуют отображения информации об ошибках.

Исключения CLAJR CLAJR.getHelp () и CLAJR

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
catch (CLAJR.EmptyArgumentListException emptyArgsEx)
{
   out.println("Usage: Main -f|--file  [-v|--verbose]");
}
catch (CLAJR.HelpNeededException helpNeededEx)
{
   out.println(CLAJR.getHelp());
}
catch (CLAJR.ParseException parseEx)
{
   out.println(parseEx.getMessage());
   out.println(CLAJR.getHelp());
}
catch (Throwable throwable)  // CLAJR.parse throws Throwable
{
   out.println(throwable.getMessage());
}

Метод CLAJR 0.9 CLAJR.parse(String[], Object...) Throwable поэтому приведенный выше код перехватывает этот Throwable .

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

Чтобы мои примеры работали, мне пришлось изменить исходный файл CLAJR.java . В частности, я изменил строку 491 в методе invoke(String, String, boolean, List) с if (tails == null) на if (tails == null || tails.isEmpty()) . Это одно из преимуществ открытого исходного кода; можно настроить или исправить код по мере необходимости.

CLAJR позволяет рефлексивно обращаться к методу, названному с одним подчеркиванием. Этот метод соответствует «хвостовому» параметру или параметрам. Я не использовал это в этом примере, но интересно отметить, что это не будет работать в JDK 9, потому что в качестве идентификатора в JDK 9 не допускается ни одного подчеркивания. Фактически, Javac 8 JDK предупреждает об этом сейчас, как показано в следующий снимок экрана.

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

  • CLAJR имеет открытый исходный код и лицензируется GNU Lesser General Public License ( версия 2.1 или более поздняя).
  • CLAJR доступен для загрузки в виде ZIP-файла размером примерно 11 КБ с именем CLAJR-0.9-src.zip, который содержит один файл CLAJR-0.9.java .
  • CLAJR 0.9 не требует загрузки сторонних библиотек.
  • CLAJR существует уже некоторое время, но, похоже, не обновлялась уже несколько лет. Мне пришлось внести небольшие изменения в исходный код, чтобы заставить его работать должным образом для меня.

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

Дополнительные ресурсы

Ссылка: Интерфейсы командной строки Java (часть 12): CLAJR от нашего партнера JCG Дастина Маркса из блога Inspired by Actual Events .