Это седьмой пост в моей серии, в котором кратко представлены различные библиотеки для обработки аргументов командной строки в Java. Этот пост возвращается к освещению библиотеки на основе аннотаций, которая кажется одной из наиболее известных и популярных из многочисленных доступных библиотек для обработки аргументов командной строки из Java: JCommander .
Веб -страница JCommander гласит: «Поскольку жизнь слишком коротка для разбора параметров командной строки», а « Обзор» представляет JCommander как «очень маленькую среду Java, которая упрощает анализ параметров командной строки». Примеры кода и соответствующие снимки экрана исполняемого кода в этом посте основаны на JCommander 1.72 (июнь 2017 г.). Полный код показанных здесь демонстраций доступен на GitHub .
JCommander использует аннотации для реализации этапа «определения» обработки командной строки. Это продемонстрировано в следующем фрагменте кода.
Этап «Определение» с JCommander
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
/** * Demonstrates use of JCommander for Java-based command-line processing. */ public class Main { @Parameter (names={ "-v" , "--verbose" }, description= "Enable verbose logging" ) private boolean verbose; @Parameter (names={ "-f" , "--file" }, description= "Path and name of file to use" , required= true ) private String file; @Parameter (names={ "-h" , "--help" }, description= "Help/Usage" , help= true ) private boolean help; // . . . final JCommander commander = JCommander.newBuilder() .programName( "JCommander Demonstration" ) .addObject( this ) .build(); |
Только что показанный листинг кода демонстрирует использование аннотации @Parameter в JCommander для определения параметров командной строки через аннотацию полей класса. В примерах демонстрируется спецификация names
для обозначения нескольких флагов опций, которые должны быть связаны с одной опцией, description
для предоставления описания каждой опции, required=true
для обеспечения наличия аргумента командной строки и help=true
для указания «help» »Или« использование »аргумента командной строки (указывает JCommander не генерировать исключение, если требуемые аргументы также не предоставлены).
С атрибутами класса, аннотированными аннотациями @Parameter
, экземпляр класса с аннотированными полями можно использовать для создания экземпляра класса JCommander . В приведенном выше примере кода я использовал JCommander.Builder для большей беглости и других преимуществ, связанных с использованием компоновщиков. В частности, экземпляр с аннотированными полями классов добавляется с помощью метода addObject (Object) .
Этап «синтаксического анализа» обработки командной строки с помощью JCommander выполняется с помощью вызова одной строки метода синтаксического анализа (String…) на экземпляре JCommander
который был только что JCommander
. Это продемонстрировано в следующем листинге кода.
Этап «Разбор» с JCommander
1
|
commander.parse(arguments); |
Этап «допроса» обработки командной строки с помощью JCommander включает простой доступ к аннотированным полям экземпляра, переданного в JCommander
класса JCommander
. Это продемонстрировано в следующем листинге кода.
Этап «Допрос» с JCommander
1
2
3
4
5
6
7
8
9
|
if (help) { commander.usage(); } else { out.println( "The file name provided is '" + file + "' and verbosity is set to " + verbose); } |
Последний листинг кода демонстрирует возможность определения, был ли boolean
атрибут с help
имени задан спецификацией --help
или -h
. Поскольку это простое boolean
, его можно использовать в условных выражениях и, если оно true
, предоставляется информация справки / использования. В случае, если флаг «помощь» не был установлен, доступ к значениям, связанным с другими параметрами командной строки («verbose» / -v
/ --verbose
и «file» / -f
/ --file
).
Самый последний листинг кода также демонстрирует запись информации об использовании в стандартный вывод посредством вызова метода JCommander
() в экземпляре класса JCommander
. Стоит отметить, что у ParameterException
также есть метод use () .
Следующая серия снимков экрана демонстрирует использование JCommander с простым приложением, включающим приведенные выше фрагменты кода. Первое изображение показывает запуск приложения на основе JCommander без каких-либо аргументов и показывает исключение ParameterException , которое отображается в этом случае, поскольку не была указана необходимая опция --file
/ -f
.
Следующий снимок экрана демонстрирует «нормальное» выполнение, когда предоставляются ожидаемые аргументы командной строки.
Следующий снимок экрана демонстрирует использование опции «помощь». Поскольку это было аннотировано с help=true
, отсутствие обязательного аргумента командной строки «file» не приводит к исключению, и автоматически сгенерированная справка / информация об использовании записывается в стандартный вывод.
JCommander предоставляет функцию, которая мне очень нравится для разработки и изучения JCommander. Можно указать повышенную детализацию анализа JCommander, вызвав метод verbose (int) в JCommandBuilder .
Увеличивая многословность JCommander
1
2
3
4
5
6
|
final JCommander commander = JCommander.newBuilder() .programName( "JCommander Demonstration" ) .addObject( this ) .verbose( 1 ) .build(); |
С увеличением детализации можно лучше понять, что делает JCommander в отношении обработки в командной строке, и это продемонстрировано на следующих двух снимках экрана.
Вот некоторые дополнительные характеристики JCommander, которые следует учитывать при выборе каркаса или библиотеки, чтобы помочь с анализом командной строки в Java.
- JCommander имеет открытый исходный код и лицензируется с помощью Apache License 2.0 .
- Размер
jcommander-1.72.jar
составляет приблизительно 68 КБ, и он не имеет сторонних зависимостей компиляции библиотеки. - Документация по JCommander содержит примеры использования JCommander с Kotlin и использования JCommander с Groovy .
- JCommander все еще активно поддерживается создателем TestNG Седриком Беустом, и его веб-страница отражает его современную / текущую поддержку.
Дополнительные ссылки
- JCommander
- JCommander в репозитории Maven
- JCommander Source на GitHub
- JCommander API (Javadoc)
- Синтаксис сложных командных строк в JCommander
- JCommander — простой анализ параметров командной строки
- Простое кодирование интерфейса командной строки с JCommander
- Args4j против JCommander для анализа параметров командной строки
- Флаги командной строки Java с JCommander и Spring
- JCommander Versus args4j
Ссылка: | Интерфейсы командной строки Java (часть 7): JCommander от нашего партнера JCG Дастина Маркса в блоге Inspired by Actual Events . |