Этот замечательный Spring Shell
2026-03-10 22:34 Diff

Теги: spring boot, программирование на java, cli-интерфейс, spring shell, консольный интерфейс

В этой заметке хотим вас познакомить с замечательным проектом Spring Shell для создания CLI-интерфейса. Если для вашего проекта Web UI или UI на Swing слишком сложен, но хочется использовать все возможности Spring, то Spring Shell — прекрасное решение.

Задача — сделать приложение, которое говорит пользователю "Hello, ${username}"

Для начала создадим пустой проект на основе Spring Boot. Можем попробовать его собрать:

И запустить:

И, конечно, сначала добавим бизнес-логику HelloService:

@Service public class HelloService { public String helloTo(String username) { return "Hello, " + username; } }

Добавим к этому сервису интерфейс из Spring Shell. Сначала maven-зависимость:

<dependency> <groupId>org.springframework.shell</groupId> <artifactId>spring-shell-starter</artifactId> <version>2.0.1.RELEASE</version> </dependency>

Эта зависимость является, так называемым, «стартером». Вам необходимо добавить только её, а другие необходимые зависимости подключаются транзитивно. Хотим отметить, что этот «стартер» не является «Spring Boot-стартером», и может быть использован вне Spring Boot.

Попробуем запустить наше приложение:

После некоторого вывода в консоль, мы увидим приглашение spring-shell.

Мы можем посмотреть список всех доступных команд:

shell:>help AVAILABLE COMMANDS Built-In Commands clear: Clear the shell screen. exit, quit: Exit the shell. help: Display help about available commands. history: Display or save the history of previously run commands script: Read and execute commands from a file. stacktrace: Display the full stacktrace of the last error.

Круто! Попробуйте запустить clear. А также посмотрите историю команд:

shell:>history help clear history

Как, ни странно, даже запуская тесты у нас тоже запустится shell-консоль:

mvnw clean install ... shell:>

Чтобы в рамках тестов она не запускалась — сделаем некоторые правки:

@RunWith(SpringRunner.class) @SpringBootTest(properties = { InteractiveShellApplicationRunner.SPRING_SHELL_INTERACTIVE_ENABLED + "=false", ScriptShellApplicationRunner.SPRING_SHELL_SCRIPT_ENABLED + "=false" }) public class SpringShellDemoApplicationTests {

Вот, теперь мы готовы к тому, чтобы реализовать консольный интерфейс к нашей логике:

@ShellComponent public class HelloShell { private final HelloService helloService; public HelloShell(HelloService helloService) { this.helloService = helloService; } @ShellMethod(key = "hello-to", value = "Say hello to username") public String helloTo(@ShellOption({"username", "u"}) String username) { return helloService.helloTo(username); } }

Испытаем в деле?

shell:>help AVAILABLE COMMANDS ... Hello Shell hello-to: Say hello to username

Да, обратите внимание на description группы команд и самой команды. Если мы введём неполную команду, то получим:

shell:>hello-to Parameter 'username string' should be specified Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.

Ну и, наконец:

shell:>hello-to Ivan Hello, Ivan

С приведённым кодом можно ознакомиться здесь. И не забывайте оставлять свои комментарии!