Статьи

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

Библиотека обработки аргументов командной строки на основе Java, описанная в этом посте, была избранной библиотекой статьи IBM developerWorks « Динамика программирования Java», часть 3, «Прикладное отражение» (эта статья 2003 года была «заархивирована» в 2016 году, но все еще доступна для скачивания в формате PDF ) , Библиотека, называемая JArgp (библиотека обработки аргументов командной строки Java), определена на ее главной веб-странице как «библиотека для обработки аргументов командной строки в Java». На этой странице добавлено: «В отличие от большинства других библиотек этого типа, JArgp использует отражение для хранения фактических значений непосредственно в полях целевого объекта приложения». JArgp 1.0 показан в этом посте.

JArgp — это минималистичная библиотека, о чем свидетельствует небольшое количество классов в JARgp JAR.

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

Этап «Определение» с JArgp

1
2
3
4
5
private static final ParameterDef[] PARAMETERS_DEFINITIONS =
{
   new StringDef('f', "file", "File path and name"),
   new BoolDef('v', "verbose", "Verbosity level")
};

Начальным аргументом для конструкторов расширяющих классы ParameterDef StringDef и BoolDef является единственный символ, который будет флагом командной строки. В этом случае, определенные флаги аргумента командной строки будут «-f» для пути к файлу / имени и «-v» для многословия. Второй аргумент каждого конструктора — это имя поля класса, в которое будут записываться любые значения, связанные с флагами командной строки. Третий аргумент каждого конструктора — это описание флага аргумента командной строки. Насколько я могу судить, нет способа указать «длинные» имена аргументов (в этом случае нет возможности указать --file или --verbose ).

Этап «синтаксического анализа» выполняется в JArgp с помощью вызова статического метода ArgumentProcessor processArgs (String [], ParameterDef [], Object) . Это иллюстрируется в следующем листинге кода.

«Разбор» в JArgp

1
2
3
4
5
6
final Main instance = new Main();
// The integer returned by the next invocation is actually the
// zero-based index of next argument to be processed
final int numberArgumentsProcessed
   = ArgumentProcessor.processArgs(
arguments, PARAMETERS_DEFINITIONS, instance);

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

Этап «Допрос» в JArgp

1
2
3
out.println(
     "File path/name is " + instance.file
   + " and verbosity is " + instance.verbose);

Использование приведенного кода продемонстрировано на следующем снимке экрана.

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

1
2
3
4
5
final Main instance = new Main();
final ArgumentProcessor argumentProcessor
   = new ArgumentProcessor(PARAMETERS_DEFINITIONS);
argumentProcessor.processArgs(arguments, instance);
argumentProcessor.listParameters(50, out);

Последняя строка в предыдущем листинге кода демонстрирует, как метод ArgumentProcessor.listParameters (int, PrintStream) можно использовать для записи флагов и их описаний для вывода. Этот вывод демонстрируется на следующем снимке экрана.

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

JArgp — это минималистичная библиотека для обработки аргументов командной строки в Java. Он не поддерживает «длинные» имена аргументов по умолчанию и не поддерживает столько функций, сколько некоторые другие библиотеки, описанные в этой серии, но он небольшой и простой в использовании. В первую очередь я включил его в эту серию из-за того, что он связан с статьей IBM DeveloperWorks .

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

Опубликовано на Java Code Geeks с разрешения Дастина Маркса, партнера нашей программы JCG . См. Оригинальную статью здесь: Интерфейсы командной строки Java (часть 16): JArgp

Мнения, высказанные участниками Java Code Geeks, являются их собственными.