Васильев Андрей Михайлович, 2024
Версии презентации
Официальная документация: https://jcommander.org/
JavaDoc-документация: https://javadoc.io/doc/com.beust/jcommander/latest/index.html
Альтернаитвное Java-решение: https://picocli.info/
Для работы с библиотекой, её необходимо добавить в список зависимостей приложения
Maven-строка для подключения: "org.jcommander:jcommander:2.0"
При использовании Gradle без дополнений её необходимо добавить в файл
build.gradle.kts
в раздел dependencies
:
dependencies {
implementation("org.jcommander:jcommander:2.0")
}
При использовании шаблона лабораторной добавьте строку в файл
build.properties.json
в список dependencies
val commander: JCommander =
JCommander
.newBuilder()
.addObject(commonParameters)
.addCommand("list", listCommand)
.addCommand("build", buildCommand)
.build()
newBuilder()
build()
commander.parse("--some", "list", "--size")
val arguments: Array<String> = ...
commander.parse(*arguments)
Обработка аргументов возможна из списка строк, массива строк
@Parameters(separators = "=")
class Args {
@Parameter
var targets: List<String> = arrayListOf()
@Parameter(names = ["-bf", "--buildFile"],
description = "The build file")
var buildFile: String? = null
@Parameter(names = ["--checkVersions"],
description = "Check if there are any newer versions")
var checkVersions = false
}
separators="="
включается обработка аргументов в формате
ключ=значение
помимо формата ключ значение
names
JCommander постарается автоматически преобразовать данные из строкового представления в тип данных свойства класса для: логических полей, целые числа, вещественные числа и строки
Для других сложных классов можно предоставить класс-преобразователь, который должен реализовывать следующий интерфейс:
public interface IStringConverter<T> {
T convert(String value);
}
Например для UUID такой класс может выглядеть следующим образом:
class UUIDConverter : IStringConverter<UUID> {
override fun convert(parameter: String): UUID =
UUID.fromString(parameter)
}
В целевом объекте необходимо сослаться на данный преобразователь следующим образом:
@Parameter(names=["--id"], converter = UUIDConverter::class)
var someId: UUID = UUID(0, 0)
Аннотация Parameter позволяет указать аргумент как обязательный:
@Parameter(names=["--data-one"], required = true)
var dataOne: Int = 0
Согласно документации в случае отсутствия аргумента будет выброшено соответствующее исключение. Однако в данном случае оно не будет выброшено
null
, то
будет выброшено исключениеСледовательно надо писать так:
@Parameter(names=["--data-one"], required = true)
var dataOne: Int? = null
Факт отсутствия исключения не убеждает компилятор Kotlin в наличие
не-null
-значения в свойстве объекта
Приложения с командным интерфейсом зачастую предоставляют ряд связных между собой действий, каждое из которых имеет свой собственный набор аргументов
git clone <REPOSITORY>
git switch --create <BRANCH>
Названием команды обычно выступает первый позиционный аргумент приложения
Согласно концепции JCommander
parsedCommand
JCommander способен сформировать справку по использованию всех доступных аргументов, их значений по умолчанию и т.д.
Для вывода этой информации на стандартный поток вывода, вызовите метод usage()
на объекте JCommander после добавления к нему объектов и команд
При разработке приложения с большим количеством аргументов надо иметь возможность удобным образом переключаться между разными наборами аргументов
Помимо использования модульных тестов JCommander предоставляет возможность
считывания списка аргументов из файла с помощью @
-синтаксиса
commander.parse("@params.txt")
Из файла params.txt
, который находится в текущем рабочем каталоге:
#
, будут проигнорированы@
-аргументыДанный подход удобнее постоянного редактирования конфигурации запуска Gradle-задачи