CLI фреймворки для Java: создаём мощные консольные приложения
Разработка консольных (CLI) приложений на Java — задача, с которой сталкивается каждый разработчик. Ручная обработка аргументов командной строки через main(String[] args) быстро становится громоздкой и подверженной ошибкам. К счастью, в экосистеме Java существуют зрелые фреймворки, которые берут на себя парсинг, валидацию, автодополнение и генерацию справки. В этой статье мы рассмотрим три ведущих инструмента: Picocli, JCommander и Spring Shell.
1. Picocli — современный и производительный
Picocli — это фреймворк с минимальным размером (всего 1,5 МБ), который не требует внешних зависимостей. Он поддерживает аннотации, автодополнение для Bash/Zsh и встроенную генерацию справки. Picocli идеально подходит для микросервисов и инструментов командной строки.
Основные возможности:
- Аннотации
@Command,@Option,@Parameters - Вложенные подкоманды (subcommands)
- Типизированные параметры (int, boolean, enum, коллекции)
- Автоматическая валидация (обязательные параметры, диапазоны)
- Цветной вывод и прогресс-бары
- Нативная компиляция GraalVM
Пример кода:
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
import picocli.CommandLine.Parameters;
@Command(name = "greet", description = "Приветствие пользователя")
public class GreetCommand implements Runnable {
@Option(names = {"-n", "--name"}, description = "Имя пользователя", required = true)
private String name;
@Option(names = {"-c", "--count"}, description = "Количество повторений", defaultValue = "1")
private int count;
@Parameters(index = "0", description = "Сообщение", defaultValue = "Привет")
private String message;
@Override
public void run() {
for (int i = 0; i < count; i++) {
System.out.println(message + ", " + name + "!");
}
}
public static void main(String[] args) {
int exitCode = new CommandLine(new GreetCommand()).execute(args);
System.exit(exitCode);
}
}
Запуск: java GreetCommand -n Мир -c 2 "Здравствуй" выведет:
Здравствуй, Мир!
Здравствуй, Мир!
2. JCommander — проверенный временем
JCommander — один из старейших CLI-фреймворков (с 2010 года), используемый в таких проектах, как Jenkins и TestNG. Он поддерживает аннотации, сложные типы и интернационализацию. JCommander отличается простотой API и отличной документацией.
Ключевые особенности:
- Аннотации
@Parameterс именами и описаниями - Поддержка вложенных команд через
JCommander.addCommand() - Валидация через кастомные
IParameterValidator - Генерация справки с
usage() - Работа с файлами конфигурации
Пример кода:
import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
@Parameters(commandDescription = "Калькулятор")
public class CalculatorCommand {
@Parameter(names = {"--a"}, description = "Первое число", required = true)
private int a;
@Parameter(names = {"--b"}, description = "Второе число", required = true)
private int b;
@Parameter(names = {"--op"}, description = "Операция: add/sub/mul/div")
private String operation = "add";
public void run() {
double result;
switch (operation) {
case "add": result = a + b; break;
case "sub": result = a - b; break;
case "mul": result = a * b; break;
case "div": result = (b != 0) ? (double) a / b : Double.NaN; break;
default: System.out.println("Неизвестная операция"); return;
}
System.out.println("Результат: " + result);
}
public static void main(String[] args) {
CalculatorCommand cmd = new CalculatorCommand();
JCommander jc = JCommander.newBuilder()
.addObject(cmd)
.build();
jc.parse(args);
cmd.run();
}
}
Запуск: java CalculatorCommand --a 10 --b 3 --op div выведет: Результат: 3.