CLI фреймворки для Java: создаём мощные консольные приложения
Java остаётся одним из самых популярных языков для создания серверных приложений, но и консольные утилиты на нём пишутся регулярно. Однако ручной разбор аргументов командной строки через args[] быстро превращается в хаос при появлении опций, флагов и вложенных команд. На помощь приходят специализированные CLI-фреймворки. В этой статье мы рассмотрим три ведущих инструмента: Picocli, JCommander и Spring Shell. Вы узнаете их особенности, увидите примеры кода и сможете выбрать подходящий для своего проекта.
1. Picocli — современный и производительный
Picocli (произносится «пайк-кли») — это лёгкий фреймворк с минимальными зависимостями. Он поддерживает аннотации, автодополнение в shell, вложенные команды и даже генерацию справки в формате man-страницы. Picocli идеально подходит для создания как простых утилит, так и сложных многоуровневых CLI.
Пример базового калькулятора с Picocli:
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
import picocli.CommandLine.Parameters;
@Command(name = "calc", mixinStandardHelpOptions = true, version = "1.0",
description = "Простой калькулятор")
public class Calculator implements Runnable {
@Parameters(index = "0", description = "Первое число")
private double a;
@Parameters(index = "1", description = "Второе число")
private double b;
@Option(names = {"-o", "--operation"}, defaultValue = "+",
description = "Операция: +, -, *, /")
private String operation;
@Override
public void run() {
double result = switch (operation) {
case "+" -> a + b;
case "-" -> a - b;
case "*" -> a * b;
case "/" -> a / b;
default -> throw new IllegalArgumentException("Неизвестная операция: " + operation);
};
System.out.printf("Результат: %.2f%n", result);
}
public static void main(String[] args) {
int exitCode = new CommandLine(new Calculator()).execute(args);
System.exit(exitCode);
}
}
Запуск: java Calculator 10 5 -o "*" выведет Результат: 50.00. Picocli автоматически сгенерирует справку по --help и версию по --version.
2. JCommander — проверенный временем
JCommander — одна из старейших библиотек для разбора аргументов в Java. Она использует аннотации, но предоставляет больше ручного контроля над парсингом. JCommander часто выбирают для проектов, где требуется гибкость и интеграция с существующим кодом.
Пример конвертера валют с JCommander:
import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
@Parameters(commandDescription = "Конвертер валют")
public class CurrencyConverter {
@Parameter(names = {"--amount", "-a"}, description = "Сумма", required = true)
private Double amount;
@Parameter(names = {"--from", "-f"}, description = "Из какой валюты (USD, EUR)", required = true)
private String from;
@Parameter(names = {"--to", "-t"}, description = "В какую валюту", required = true)
private String to;
@Parameter(names = {"--help", "-h"}, help = true, description = "Показать справку")
private boolean help;
public void run() {
if (help) {
JCommander jc = new JCommander(this);
jc.usage();
return;
}
// Упрощённая логика конвертации
double rate = switch (from.toUpperCase() + "_" + to.toUpperCase()) {
case "USD_EUR" -> 0.92;
case "EUR_USD" -> 1.09;
default -> 1.0;
};
System.out.printf("%.2f %s = %.2f %s%n", amount, from.toUpperCase(), amount * rate, to.toUpperCase());
}
public static void main(String[] args) {
CurrencyConverter converter = new CurrencyConverter();
JCommander jc = JCommander.newBuilder().addObject(converter).build();
jc.parse(args);
converter.run();
}
}
Запуск: java CurrencyConverter --amount 100 --from USD --to EUR.
3. Spring Shell — для enterprise-решений
Spring Shell — это полноценный фреймворк из экосистемы Spring, который предоставляет интерактивную командную оболочку. Он поддерживает автодополнение, историю команд, цветной вывод и интеграцию с Spring Boot. Идеален для административных панелей и сложных систем с множеством команд.
Пример команды в Spring Shell:
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;
import org.springframework.shell.standard