Библиотека 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 [доступных]», потому что «они, как правило, сложны для изучения и использования».
Дополнительные ссылки
- синтаксический анализ-CMD
- parse-cmd Source
- Parse-cmd Загрузки
- parse-cmd — Requirement.wiki
- parse-cmd — sampleSource.wiki
Ссылка: | Интерфейсы командной строки Java (часть 9): parse-cmd от нашего партнера по JCG Дастина Маркса из блога Inspired by Actual Events . |