0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: spring boot, программирование на java, cli-интерфейс, spring shell, консольный интерфейс</p>
1
<p>Теги: spring boot, программирование на java, cli-интерфейс, spring shell, консольный интерфейс</p>
2
<p>В этой заметке хотим вас познакомить с замечательным проектом Spring Shell для создания<strong>CLI-интерфейса</strong>. Если для вашего проекта Web UI или UI на Swing слишком сложен, но хочется использовать все возможности Spring, то Spring Shell - прекрасное решение.</p>
2
<p>В этой заметке хотим вас познакомить с замечательным проектом Spring Shell для создания<strong>CLI-интерфейса</strong>. Если для вашего проекта Web UI или UI на Swing слишком сложен, но хочется использовать все возможности Spring, то Spring Shell - прекрасное решение.</p>
3
<h2>Задача - сделать приложение, которое говорит пользователю "Hello, ${username}"</h2>
3
<h2>Задача - сделать приложение, которое говорит пользователю "Hello, ${username}"</h2>
4
<p>Для начала создадим пустой проект на основе<strong>Spring Boot</strong>. Можем попробовать его собрать:</p>
4
<p>Для начала создадим пустой проект на основе<strong>Spring Boot</strong>. Можем попробовать его собрать:</p>
5
<p>И запустить:</p>
5
<p>И запустить:</p>
6
<p>И, конечно, сначала добавим бизнес-логику HelloService:</p>
6
<p>И, конечно, сначала добавим бизнес-логику HelloService:</p>
7
@Service public class HelloService { public String helloTo(String username) { return "Hello, " + username; } }<p>Добавим к этому сервису интерфейс из Spring Shell. Сначала maven-зависимость:</p>
7
@Service public class HelloService { public String helloTo(String username) { return "Hello, " + username; } }<p>Добавим к этому сервису интерфейс из Spring Shell. Сначала maven-зависимость:</p>
8
<dependency> <groupId>org.springframework.shell</groupId> <artifactId>spring-shell-starter</artifactId> <version>2.0.1.RELEASE</version> </dependency><p>Эта зависимость является, так называемым, "стартером". Вам необходимо добавить только её, а другие необходимые зависимости подключаются транзитивно. Хотим отметить, что этот "стартер" не является "Spring Boot-стартером", и может быть использован вне Spring Boot.</p>
8
<dependency> <groupId>org.springframework.shell</groupId> <artifactId>spring-shell-starter</artifactId> <version>2.0.1.RELEASE</version> </dependency><p>Эта зависимость является, так называемым, "стартером". Вам необходимо добавить только её, а другие необходимые зависимости подключаются транзитивно. Хотим отметить, что этот "стартер" не является "Spring Boot-стартером", и может быть использован вне Spring Boot.</p>
9
<p>Попробуем запустить наше приложение:</p>
9
<p>Попробуем запустить наше приложение:</p>
10
<p>После некоторого вывода в консоль, мы увидим приглашение spring-shell.</p>
10
<p>После некоторого вывода в консоль, мы увидим приглашение spring-shell.</p>
11
<p>Мы можем посмотреть список всех доступных команд:</p>
11
<p>Мы можем посмотреть список всех доступных команд:</p>
12
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.<p>Круто! Попробуйте запустить clear. А также посмотрите историю команд:</p>
12
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.<p>Круто! Попробуйте запустить clear. А также посмотрите историю команд:</p>
13
shell:>history help clear history<p>Как, ни странно, даже запуская тесты у нас тоже запустится<strong>shell-консоль</strong>:</p>
13
shell:>history help clear history<p>Как, ни странно, даже запуская тесты у нас тоже запустится<strong>shell-консоль</strong>:</p>
14
mvnw clean install ... shell:><p>Чтобы в рамках тестов она не запускалась - сделаем некоторые правки:</p>
14
mvnw clean install ... shell:><p>Чтобы в рамках тестов она не запускалась - сделаем некоторые правки:</p>
15
@RunWith(SpringRunner.class) @SpringBootTest(properties = { InteractiveShellApplicationRunner.SPRING_SHELL_INTERACTIVE_ENABLED + "=false", ScriptShellApplicationRunner.SPRING_SHELL_SCRIPT_ENABLED + "=false" }) public class SpringShellDemoApplicationTests {<p>Вот, теперь мы готовы к тому, чтобы реализовать<strong>консольный интерфейс</strong>к нашей логике:</p>
15
@RunWith(SpringRunner.class) @SpringBootTest(properties = { InteractiveShellApplicationRunner.SPRING_SHELL_INTERACTIVE_ENABLED + "=false", ScriptShellApplicationRunner.SPRING_SHELL_SCRIPT_ENABLED + "=false" }) public class SpringShellDemoApplicationTests {<p>Вот, теперь мы готовы к тому, чтобы реализовать<strong>консольный интерфейс</strong>к нашей логике:</p>
16
@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); } }<h2>Испытаем в деле?</h2>
16
@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); } }<h2>Испытаем в деле?</h2>
17
shell:>help AVAILABLE COMMANDS ... Hello Shell hello-to: Say hello to username<p>Да, обратите внимание на description группы команд и самой команды. Если мы введём неполную команду, то получим:</p>
17
shell:>help AVAILABLE COMMANDS ... Hello Shell hello-to: Say hello to username<p>Да, обратите внимание на description группы команд и самой команды. Если мы введём неполную команду, то получим:</p>
18
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.<p>Ну и, наконец:</p>
18
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.<p>Ну и, наконец:</p>
19
shell:>hello-to Ivan Hello, Ivan<p>С приведённым кодом можно ознакомиться<a>здесь</a>. И не забывайте оставлять свои комментарии!</p>
19
shell:>hello-to Ivan Hello, Ivan<p>С приведённым кодом можно ознакомиться<a>здесь</a>. И не забывайте оставлять свои комментарии!</p>
20
20