Статьи

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

JSAP ( Java Simple Argument Parser ) 2.1 — это двадцатый пост в этой серии, посвященный обработке аргументов командной строки из Java. На странице JSAP описана причина существования библиотеки: «Я нашел в Интернете несколько анализаторов, каждый из которых обрабатывал коммутаторы, но ни один из них не обладал той универсальностью, которую я хотел в плане типов возвращаемых данных и файлов конфигурации».

JSAP предлагает немного гибкости при обычных затратах некоторой сложности. К счастью, JSAP предоставляет класс SimpleJSAP, который облегчает выполнение простых задач с помощью JSAP. Документация JSAP формулирует это следующим образом : «Если вы хотите минимизировать объем кода, обрабатывающего командную строку, JSAP предлагает SimpleJSAP, который выполняет большую часть работы за вас». Следующий листинг кода демонстрирует использование SimpleJSAP в одном (хотя и многословном) операторе для определения ожидаемых параметров командной строки.

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

1
2
3
4
5
6
final SimpleJSAP jsap = new SimpleJSAP(
   "Main Application",
   "Demonstrate JSAP",
   new Parameter[]
      {new FlaggedOption("file", STRING_PARSER, NO_DEFAULT, REQUIRED, 'f', "file", "File path/name."),
       new Switch("verbose", 'v', "verbose", "Requests verbose output." )});

В приведенном выше листинге кода я использовал статический импорт, чтобы уменьшить детализацию этого «определения» кода. Это можно увидеть в полном списке кодов, доступных на GitHub . Приведенный выше код определяет две опции, которые используются во всех публикациях их серий о библиотеках, используемых для анализа аргументов командной строки в Java: путь к файлу / имя и многословность. Одиночные символы 'f' и 'v' являются короткими именами опций, а длинные имена опций следуют за ними в соответствующих вызовах ( file и verbose ). Обратите внимание, что «определение» аргументов командной строки также может быть настроено с помощью XML , хотя здесь это не демонстрируется.

Этап «синтаксического анализа» выполняется в JSAP с помощью одного отдельного оператора, в котором вызов метода parse (String []) для экземпляра SimpleJSAP возвращает экземпляр JSAPResult .

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

1
final JSAPResult parsedResult = jsap.parse(arguments);

Стадия «опроса» в JSAPResult выполняется с помощью вызова экземпляра JSAPResult возвращаемого методом parse как показано в следующем листинге кода.

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

1
2
out.println("File path/name is '" + parsedResult.getString("file") + "'.");
out.println("Verbosity level is " + parsedResult.getBoolean("verbose"));

JSAP сгенерирует автоматические операторы использования и справки . В следующем листинге кода демонстрируется использование метода SimpleJSAP.messagePrinted () для определения того, произошла ли какая-либо ошибка синтаксического анализа, а затем использование сообщения SimpleJSAP.getHelp () для доступа к автоматически сгенерированному сообщению «помощь».

«Помощь» с JSAP

1
2
3
4
5
if (jsap.messagePrinted())
{
   out.println(jsap.getHelp());
   System.exit( -1 );
}

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

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

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

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

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

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