CLI фреймворки для Java: обзор и сравнение лучших инструментов

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

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

Начать курс

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) — это не просто фреймворк для парсинга аргументов, а полноценная интерактивная оболоч

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