如何让Spring-Shell不解析命令行参数为Shell命令并保持交互模式?
解决方案
问题1:区分启动选项与Shell命令
Spring Shell默认会将所有传入的命令行参数当作Shell命令解析,导致--flag被误识别。有两种常用解决方式:
- 命令行分隔符方式:用
--作为Spring Boot启动参数和Shell命令的分隔符,让--flag被Spring Boot处理,--之后的内容才交给Spring Shell:java -jar my.jar --flag -- com.mycompany.App - 代码过滤方式:自定义
ApplicationRunner提前过滤启动参数,将非Shell命令的参数移除后再交给Spring Shell:@Component public class StartupArgsFilter implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { List<String> shellArgs = Arrays.stream(args.getSourceArgs()) .filter(arg -> !arg.startsWith("--")) .collect(Collectors.toList()); System.setProperty("spring.shell.args", String.join(" ", shellArgs)); } }
问题2:强制保持交互模式
Spring Shell默认在传入命令行参数时启用NonInteractiveShellRunner,要强制维持交互模式,可通过以下两种方式实现:
- 配置文件禁用:在
application.properties中添加配置,直接关闭非交互Runner:spring.shell.runner.non-interactive.enabled=false - 代码自定义优先级:创建配置类,调整Runner的启用状态与执行优先级:
@Configuration public class ShellConfig { @Bean public InteractiveShellRunner interactiveShellRunner(Shell shell, ShellContext shellContext) { InteractiveShellRunner runner = new InteractiveShellRunner(shell, shellContext); runner.setOrder(Ordered.HIGHEST_PRECEDENCE); return runner; } @Bean public NonInteractiveShellRunner nonInteractiveShellRunner(Shell shell, ShellContext shellContext) { NonInteractiveShellRunner runner = new NonInteractiveShellRunner(shell, shellContext); runner.setEnabled(false); return runner; } }
也可以直接通过命令行参数临时指定:
java -jar my.jar --spring.shell.runner.non-interactive.enabled=false --flag
内容的提问来源于stack exchange,提问作者morpheus
相关产品推荐
相关产品推荐

