CLI фреймворки для Java: Picocli, JCommander и Spring Shell

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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                    

Рекомендаций