CLI фреймворки для Java: создаём мощные консольные приложения
Разработка сложных консольных приложений на Java требует не только логики, но и удобного интерфейса командной строки (CLI). Парсинг аргументов, обработка опций, вывод справки — ручная реализация этих задач трудоёмка и чревата ошибками. К счастью, существуют зрелые CLI фреймворки, которые автоматизируют этот процесс. В этой статье мы подробно разберём три ведущих инструмента: Picocli, JCommander и Spring Shell, с примерами кода и рекомендациями по выбору.
1. Picocli — современный и производительный
Picocli (https://picocli.info/) — это самый популярный CLI фреймворк для Java на сегодняшний день. Его ключевое преимущество — минималистичный API, основанный на аннотациях, и поддержка как Java, так и Kotlin, Groovy, Scala. Библиотека не требует внешних зависимостей и может генерировать автодополнение для Bash, Zsh и Fish.
Основные возможности Picocli:
- Аннотации
@Command,@Option,@Parameters - Автоматическая генерация справки (
--help) - Вложенные команды (субкоманды)
- Поддержка типов-значений (int, boolean, enum, LocalDate)
- Пользовательские конвертеры и валидаторы
Пример простого приложения на Picocli:
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
import picocli.CommandLine.Parameters;
@Command(name = "greet", description = "Приветствует пользователя")
public class GreetApp implements Runnable {
@Option(names = {"-n", "--name"}, defaultValue = "мир", description = "Имя для приветствия")
private String name;
@Option(names = {"-c", "--count"}, defaultValue = "1", description = "Количество повторений")
private int count;
@Override
public void run() {
for (int i = 0; i < count; i++) {
System.out.println("Привет, " + name + "!");
}
}
public static void main(String[] args) {
int exitCode = new CommandLine(new GreetApp()).execute(args);
System.exit(exitCode);
}
}
Запуск:
java GreetApp --name="Java разработчик" --count=3
Вывод:
Привет, Java разработчик!
Привет, Java разработчик!
Привет, Java разработчик!
2. JCommander — проверенная классика
JCommander (https://jcommander.org/) — это зрелая библиотека с богатой историей (с 2011 года). Она также использует аннотации, но предлагает более гибкую архитектуру для сложных сценариев. JCommander особенно удобен для проектов, где требуется строгий контроль над парсингом и обработкой ошибок.
Ключевые особенности JCommander:
- Аннотации
@Parameterс атрибутамиnames,required,description - Поддержка многоуровневых команд через
Commands - Встроенный валидатор параметров
- Возможность использования произвольных типов через конвертеры
Пример с JCommander:
import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
@Parameters(commandDescription = "Калькулятор")
public class Calculator {
@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() {
int 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) ? a / b : 0; break;
default: throw new IllegalArgumentException("Неизвестная операция: " + operation);
}
System.out.println("Результат: " + result);
}
public static void main(String[] args) {
Calculator calc = new Calculator();
JCommander jc = JCommander.newBuilder()
.addObject(calc)
.build();
jc.parse(args);
calc.run();
}
}
3. Spring Shell — для enterprise-приложений
Spring Shell (https://spring.io/projects/spring-shell) — это не просто фреймворк для парсинга аргументов, а полноценная интерактивная оболоч
Также в библиотеке
Планировщик задач Rust: обзор библиотек и примеры кода
FluentValidation для C# (.NET): полное руководство с примерами
Работа с Excel в PHP: библиотеки PhpSpreadsheet и OpenSpout
Работа с XML в Go: encoding/xml, библиотеки и примеры
Планировщик задач на PHP: библиотека cron‑expression для гибкого расписания