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

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

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

Начать курс

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.

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