Статьи

Интерфейсы командной строки Java (часть 9): parse-cmd

Библиотека parse-cmd состоит из одного класса, ParseCmd.java , который является «Java-классом, используемым для определения и анализа параметров командной строки в приложении Java». Библиотека размещена в Google Code Archive и может уйти в любое время . JAR также доступен на GitHub . Этот пост описывает использование parse-cmd 0.0.93 для обработки аргументов командной строки в Java.

Требование parse-cmd Wiki перечисляет несколько альтернатив для обработки аргументов командной строки в Java, включая некоторые, которые были рассмотрены ранее в этой серии. После перечисления этих альтернатив говорится: «Изучив эти и другие записи, пришло время попробовать другой анализатор». Затем в документе описываются требования, которые parse-cmd стремится удовлетворить.

Этап «определения» парсинга аргументов командной строки с помощью parse-cmd продемонстрирован в следующем (неполном) листинге кода. [Обратите внимание, что пример в этом посте аналогичен тому, который использовался в предыдущих восьми постах этой серии.]

Этап «Определение» с parse-cmd

01
02
03
04
05
06
07
08
09
10
11
12
/** String displayed where there is a problem processing arguments. */
private final static String USAGE =
   "java examples.dustin.commandline.parsecmd.Main --file <filePathAndName> [--verbose 1]";
 
public static void main(final String[] arguments)
{
   final ParseCmd parseCmd
      = new ParseCmd.Builder().parm("--file", "")
                              .req()
                              .parm("--verbose", "0")
                              .help(USAGE)
                              .build();

В листинге кода показано определение ожидаемых параметров командной строки с использованием ParseCmd.Builder () и быстрых методов, доступных в экземплярах этого класса. Каждый метод в свою очередь возвращает экземпляр одного и того же класса Builder так что эти вызовы метода могут быть объединены в цепочку, как показано выше. Как показано выше, строка use / help создается вручную и передается в Builder с помощью метода help (String), а не создается автоматически с помощью parse-cmd.

Метод ParseCmd.Builder класса ParseCmd.Builder перегружен, но в этом листинге кода я использовал метод parm(String, String) который принимает имя параметра и значение «по умолчанию» для этого параметра. Если бы я предоставил только одну строку для метода, принимающего только одну строку, по умолчанию для этого параметра было бы принято считать «1». В случае аргумента пути к файлу и имени это может привести к тому, что parse-cmd допустит неверный тип параметра. Предоставляя пустую строку явно в качестве значения по умолчанию, parse-cmd может точно обрабатывать аргумент пути и имени файла как строку переменной длины.

Аргумент --verbose также определен в вышеприведенном коде, и ему также предоставляется значение по умолчанию, поскольку неявное значение по умолчанию «1» включило бы многословие «вкл», если аргумент не был предоставлен, а это не было значением по умолчанию для многословия в любой из предыдущих постов в этой серии синтаксического анализа командной строки с Java.

Вызов req() для одного из возвращенных в цепочку экземпляров Builder указывает, что требуется ранее определенный аргумент ( --file ). В другом аргументе ( --verbose ) это не указано, поэтому по умолчанию он не является обязательным.

Насколько я могу судить, в parse-cmd нет простого подхода к указанию псевдонима или синонима для определенных аргументов командной строки. Другими словами, я не вижу способа сказать parse-cmd, что --file и -f — это один и тот же аргумент командной строки. Поэтому я использую «длинную» версию с двойными дефисами в этом примере для обоих аргументов --file и --verbose .

С помощью предыдущих библиотек синтаксического анализа на основе Java, описанных в этой серии, этап «синтаксического анализа» следует сразу же за этапом «определения». Хотя такой же переход можно осуществить с помощью parse-cmd, рекламируемый и предпочтительный подход заключается в реализации этапа «проверки» после этапа «определения» и перед этапом «синтаксического анализа». Этот этап позволяет увидеть, были ли обнаружены какие-либо ошибки во время проверки доступных аргументов командной строки и продемонстрирован в следующем (неполном) листинге кода.

Этап «Проверка» с помощью parse-cmd

1
2
3
4
5
final String errorString = parseCmd.validate(arguments);
if (!errorString.isEmpty())
{
   out.println("ERROR: " + errorString);
}

Только что показанный листинг кода демонстрирует использование метода ParseCmd.validate(String[]) используемого для проверки того, что аргументы командной строки соответствуют ожидаемым, как определено на этапе «определения». Если есть какие-либо неожиданные результаты, возвращается непустая строка. Пустая строка считается хорошей вещью и указывает на «допустимые» аргументы командной строки.

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

Этап «Разбор» с помощью parse-cmd

1
final Map<String, String> parsedArguments = parseCmd.parse(arguments);

Результатом вызова ParseCmd.parse(String[]) является Java Map<String, String> от имени аргумента к значению аргумента.

Этап «опрос» с помощью parse-cmd реализуется простым доступом к Map<String, String> возвращаемой этапом синтаксического анализа. Можно запросить ключи карты по имени аргумента, и возвращаемое значение является значением, связанным с этим именем аргумента. Обратите внимание, что подразумевается, что все аргументы, даже «логические» аргументы, такие как --verbose , имеют значение, связанное с ними, а не наличие или отсутствие флага, являющегося единственной обязательной вещью. Другими словами, --verbose должно сопровождаться значением, выраженным в командной строке. Опрос в этом случае двух ожидаемых аргументов продемонстрирован в следующем листинге кода.

Этап «Допрос» с parse-cmd

1
2
3
4
final Map<String, String> parsedArguments = parseCmd.parse(arguments);
final String filePathAndName = parsedArguments.get("--file");
   out.println("The path/name of the file is '" + filePathAndName
      + "' and verbosity is set to '" + parsedArguments.get("--verbose") + "'.");

Полный список кодов для примера, фрагменты которого были показаны в этом посте, доступен на GitHub .

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

Снимок экрана, показанный ниже, демонстрирует успешное применение обработки командной строки на основе parse-cmd аргументов командной строки --file и --verbose .

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

  • parse-cmd является открытым исходным кодом с лицензией Apache 2.0 .
  • parse-cmd хранится в архиве кода Google , который может быть «отключен» в любое время (в настоящее время говорится, «который будет отклонен в начале 2016 года»).
  • JAR-файл parsecmd-0.0.93.jar имеет размер около 50 КБ.
  • parse-cmd использует свободную реализацию Builder вместо использования аннотаций.

parse-cmd — еще одна библиотека (в настоящее время), доступная для разработчиков Java, которым необходимо обрабатывать аргументы командной строки. Он использует некоторые предположения и последствия для принятия некоторых своих решений. Автор parse-cmd написал, что parse-cmd был написан, несмотря на «несколько доступных решений для синтаксического анализа на основе Java [доступных]», потому что «они, как правило, сложны для изучения и использования».

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