Статьи

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

JArgs 1.0 отличается тем, что является темой 13-го поста моей серии о разборе аргументов командной строки в Java. JArgs — это библиотека с открытым исходным кодом ( лицензия BSD ), которая в основном поддерживается различными участниками, включая Стива Пурселла и Эвана Меллора . Оказывается, это может привести к некоторой путанице при первом использовании JArgs, поскольку имена пакетов и другие детали меняются в зависимости от того, какую версию JArgs вы применяете.

Страница проекта JArgs описывает JArgs как «удобный, компактный, предварительно упакованный и полностью документированный набор анализаторов параметров командной строки для использования программистами Java». На этой странице утверждается, что JArgs может быть выбран из других библиотек обработки командной строки на основе Java, поскольку JArgs «прост в использовании, тщательно протестирован, хорошо документирован и свободно лицензирован (лицензия BSD, поэтому нет проблем с GNU)». На странице также говорится: «Пакет небольшой и без излишеств, но функционален и содержит код, который уже давно используется в производстве».

Жаргс действительно маленький. Размер файла jargs-1.0.zip не превышает 200 КБ, а извлеченного ядра jargs.jar — всего около 12 КБ. Сторонних библиотечных зависимостей нет. На следующем снимке экрана показано содержимое файла jargs.jar, загруженного из SourceForge ( файл jargs-1.0.jar, доступный в репозитории Maven, аналогичен).

Документация для JArgs состоит в основном из документации по API, сгенерированной Javadoc, и примеров кода, таких как OptionTest и CustomOptionTest .

При использовании JArgs основным классом, который вы используете, является CmdLineParser ( jargs.gnu.CmdLineParser или com.sanityinc.jargs.CmdLineParser, в зависимости от того, где вы получаете дистрибутив JArgs и какую версию вы получаете). Если вы используете JARgs JAR, доступный через загрузку SourceForge или через репозиторий Maven , вы будете использовать основной класс jargs.gnu.CmdLineParser . С другой стороны, если вы собираете JArgs из источника, доступного на GitHub (purcell / jargs) , основным классом будет com.sanityinc.jargs.CmdLineParser . В любом случае, есть только один внешний класс CmdLineParser и он использует вложенные классы для дополнительной поддержки. В этом посте я демонстрирую примеры, основанные на JAR- jargs.gnu.CmdLineParser SourceForge / Maven с jargs.gnu.CmdLineParser . Полный исходный код моих примеров будет размещен на GitHub, и эта версия, вероятно, будет отредактирована, чтобы воспользоваться преимуществами более явного импорта для большей краткости и читаемости кода.

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

Для реализации этапа «определения» синтаксического анализа аргументов командной строки с помощью JArgs создается экземпляр класса CmdLineParser и вызывается метод addOption (CmdLineParser.Option) для этого экземпляра для каждого ожидаемого параметра командной строки. Каждый параметр представлен экземпляром класса, который расширяет класс CmdLineParser.Option . В примерах из этой серии я использовал опцию пути / имени файла на основе строк и опцию подробности на основе логического значения. Поэтому при использовании JArgs для этих примеров я могу использовать класс CmdLineParser.Option.StringOption для пути и имени файла и класс CmdLineParser.Option.BooleanOption для параметра многословия. Следующий листинг кода демонстрирует реализацию этапа «определения» с JArgs.

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

1
2
3
4
5
6
7
public static void main(final String[] arguments)
{
   final CmdLineParser cmdLineParser = new CmdLineParser();
   final CmdLineParser.Option fileOption = new CmdLineParser.Option.StringOption('f', "file");
   cmdLineParser.addOption(fileOption);
   final CmdLineParser.Option verbosityOption = new CmdLineParser.Option.BooleanOption('v', "verbose");
   cmdLineParser.addOption(verbosityOption);

Для «синтаксического анализа» с помощью JArgs требуется всего один оператор, но вам нужно перехватить два проверенных исключения, сгенерированных методом CmdLineParser.parse (String []), или явно указать, что они сгенерированы из вашего кода, который вызывается с помощью метода. Это показано в следующем листинге кода.

«Парсинг» этап с JArgs

1
2
3
4
5
6
7
8
9
try
{
   cmdLineParser.parse(arguments);
}
catch (CmdLineParser.IllegalOptionValueException | CmdLineParser.UnknownOptionException exception)
{
   out.println("Unable to parse command line options - " + exception);
   System.exit(-1);
}

Когда только что показанный код выполняется успешно (без выброса одного из двух проверенных исключений), экземпляр CmdLineParser для которого был вызван метод parse(String[]) теперь содержит значения, проанализированные для ожидаемых параметров командной строки, и поэтому мы готовы «допросить» этот экземпляр.

Этап «допроса» JArgs обработки опций командной строки использует методы в CmdLineParser.Option расширения CmdLineParser.Option которые обсуждались ранее, чтобы получить значения, проанализированные для каждой из этих опций. Существуют перегруженные версии методов CmdLineParser.getOptionValue() для выполнения этого опроса. Метод, принимающий только экземпляр Option, значение которого является желательным [ getOptionValue (CmdLineParser.Option) ], возвращает ноль, если опция не была найдена или проанализирована. Метод, принимающий экземпляр Option, значение которого является желаемым, и второй объект «по умолчанию» [ getOptionValue (CmdLineParser.Option, Object) ] возвращает возвращаемый объект по умолчанию, если эта опция не была найдена или проанализирована. В приведенном ниже листинге кода я использую вторую форму в обоих случаях и таким образом гарантирую, что мне не придется иметь дело с null .

«Допрос» этап с JArgs

01
02
03
04
05
06
07
08
09
10
final String filePathName = cmdLineParser.getOptionValue(fileOption, "null").toString();
if (filePathName.equals("null"))
{
   out.println("ERROR: File path/name must be provided.");
   System.exit(-2);
}
out.println(
     "File path/name is " + filePathName
   + " and verbosity is " + cmdLineParser.getOptionValue(verbosityOption, false)
   + ".");

С этими базовыми примерами кода запуск простого Java-приложения, использующего JArgs для обработки командной строки, продемонстрирован на следующем снимке экрана.

Класс CmdLineParser не имеет встроенной помощи / поддержки использования. Однако jargs-1.0.zip, доступный в SourceForge, включает исходный код для AutoHelpParser , класса, который расширяет CmdLineParser и иллюстрирует, как можно реализовать помощь / использование.

Поскольку он устарел и из-за своей простоты, JArgs, вероятно, может использоваться с более старыми версиями Java, чем некоторые другие библиотеки синтаксического анализа командной строки Java-basd, обсуждаемые в этой серии. Когда я запускаю javap на CmdLineParser в jargs-1.0.jar предоставленном jargs.jar , и jargs.jar , предоставленном jargs.jar , чтобы определить версию Java, с которой он был скомпилирован, я вижу, что это основная версия 45 ! Как я писал в своем посте «Программно определяемая версия компиляции JDK класса Java», основная версия 45 указывает на то, что код был скомпилирован с использованием JDK 1.1 !

Предоставленная jargs-1.0.jar версии jargs-1.0.jar из javap

1
2
3
4
5
6
7
Classfile jar:file:/C:/lib/jargs-1.0/lib/jargs-1.0.jar!/jargs/gnu/CmdLineParser.class
  Last modified Apr 9, 2005; size 6032 bytes
  MD5 checksum b2d61c0ce786f8a661cccf1e61de2a19
  Compiled from "CmdLineParser.java"
public class jargs.gnu.CmdLineParser
  minor version: 3
  major version: 45

Предоставляемая jargs.jar информация о версии jargs.jar из javap

1
2
3
4
5
6
7
Classfile jar:file:/C:/lib/jargs-1.0/lib/jargs.jar!/jargs/gnu/CmdLineParser.class
  Last modified Apr 9, 2005; size 6032 bytes
  MD5 checksum b2d61c0ce786f8a661cccf1e61de2a19
  Compiled from "CmdLineParser.java"
public class jargs.gnu.CmdLineParser
  minor version: 3
  major version: 45

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

  • JArgs является открытым исходным кодом и имеет лицензию BSD.
  • Кажется, существует некоторая путаница в отношении версий и основных участников JArgs, когда Maven и SourceForge имеют одну версию, а purcell / jargs на GitHub — другую версию.
  • JArgs маленький и простой: jargs.jar (или jargs-1.0.jar в Maven) имеет размер всего около 12 КБ, и есть зависимости от сторонних библиотек.
  • JArgs использует программные API для определения, анализа и опроса опций, а не использует аннотации или отражения.
  • JArgs немного устарел, так как многие его главные страницы имеют «последние обновления» с годами, такими как 2005. Однако страница GitHub, на которую несколько раз ссылались в этом посте и которая имеет другое имя пакета для своего основного класса, показывает свои последние обновления быть 2012.
  • Я считаю, что JArgs можно использовать с большинством Java-приложений сегодня, так как мне кажется, что он может работать с версиями Java еще в Java SE 1.1 .

Наиболее убедительные причины, по которым может потребоваться использование JArgs вместо некоторых других, более часто используемых и / или недавно обновленных обработок командной строки на основе Java, — это простота и небольшой размер. Иногда я сталкиваюсь с решением о том, какой уровень параметров командной строки, которые я хочу поддерживать, JArgs предоставляет библиотеку, которая может быть желательна, когда я хочу чуть больше, чем прямой анализ переданной String[] в функцию main, но не Мне нужны мощь и сложность некоторых других библиотек обработки команд на основе Java. Мои самые большие опасения по поводу использования JArgs, вероятно, заключаются в том, что он некоторое время не обновлялся, и возможной путанице, которая может привести к тому, что другие будут использовать мою работу и столкнуться с двумя разными проявлениями JArgs с разным именем пакета для своего основного класса (используя Maven для зависимости может очень помочь здесь). JArgs небольшой и простой, и может найти свою нишу для тех, кто хочет только самую основную обработку командной строки.

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

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