From 0ba60c47071b35c85de3bed335559949dad2e48d Mon Sep 17 00:00:00 2001 From: Piotr Olaszewski Date: Sun, 2 Nov 2025 16:55:25 +0100 Subject: [PATCH] Fix running shell in the Spring Boot applications gh-1203 Signed-off-by: Piotr Olaszewski --- .../ApplicationRunnerAutoConfiguration.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/spring-shell-autoconfigure/src/main/java/org/springframework/shell/boot/ApplicationRunnerAutoConfiguration.java b/spring-shell-autoconfigure/src/main/java/org/springframework/shell/boot/ApplicationRunnerAutoConfiguration.java index 7f4208ac8..5e1123ad7 100644 --- a/spring-shell-autoconfigure/src/main/java/org/springframework/shell/boot/ApplicationRunnerAutoConfiguration.java +++ b/spring-shell-autoconfigure/src/main/java/org/springframework/shell/boot/ApplicationRunnerAutoConfiguration.java @@ -15,20 +15,36 @@ */ package org.springframework.shell.boot; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; +import org.springframework.shell.core.ShellRunner; +import org.springframework.util.ClassUtils; +/** + * @author Janne Valkealahti + * @author Chris Bono + * @author Mahmoud Ben Hassine + * @author Piotr Olaszewski + */ @AutoConfiguration @EnableConfigurationProperties(SpringShellProperties.class) public class ApplicationRunnerAutoConfiguration { + @Bean + public ApplicationRunner applicationRunner(ObjectProvider shellRunner) { + return new ShellApplicationRunner(shellRunner); + } + @Bean @ConditionalOnProperty(prefix = "spring.shell.context", name = "close", havingValue = "true") - public ApplicationReadyEventListener applicationReadyEventListener() { + public ApplicationListener applicationReadyEventListener() { return new ApplicationReadyEventListener(); } @@ -43,4 +59,22 @@ public void onApplicationEvent(ApplicationReadyEvent event) { } + record ShellApplicationRunner(ObjectProvider shellRunner) implements ApplicationRunner { + @Override + public void run(ApplicationArguments args) throws Exception { + shellRunner.orderedStream().forEachOrdered(runner -> { + try { + boolean run = runner.run(args.getSourceArgs()); + if (run) { + return; + } + } + catch (Exception e) { + throw new IllegalStateException( + "Unable to run '" + ClassUtils.getShortName(runner.getClass()) + "'", e); + } + }); + } + } + }