本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
Spring Shell 4.0 正式发布,终于解决了命令智能补全这个老大难!
在云计算、微服务以及 AI 时代,命令行工具(CLI)依然是开发者不可或缺的生产力武器。从 Docker CLI 到 Kubernetes kubectl,再到当下的 AI Code CLI,优秀的命令行工具能极大提升运维和开发效率。而在 Java 生态中,Spring Shell正是这样一个能让你快速构建专业级命令行应用的利器。
最近,Spring 团队重磅发布了Spring Shell 4.0.0 GA版本,这不仅是版本号的跃升,更是架构和开发体验的一次全面革新。接下来,我们就一起来深入了解这个里程碑版本带来的变革吧。
Spring Shell 不只是简单的命令行框架
很多人可能没用过 Spring Shell 这个框架,下面我们就先来简单的说说它。
Spring Shell 是什么?
顾名思义,Spring Shell 就是一个与 Shell 相关的命令应用开发框架。
之所以叫 Spring Shell,是因为它是一个基于 Spring 生态的命令行应用开发框架。它允许开发者利用熟悉的 Spring 编程模型(依赖注入、自动配置、AOP 等),快速构建交互式、功能丰富的命令行工具。
与其它传统的 CLI 库相比,Spring Shell 提供了:
- 交互式 Shell 体验:支持命令补全、历史记录、彩色输出
- 声明式命令定义:通过注解轻松定义命令、参数和选项
- 强大的类型转换:自动将命令行参数转换为 Java 对象
- 完善的帮助系统:自动生成命令帮助文档
- Spring 生态无缝集成:直接使用 Spring Data、Spring Security 等组件
典型应用场景
很多人没用过这个框架,很可能是没有对应的应用场景。下面是社区网友总结的常见的一些典型应用场景。
- 管理后台工具:与 REST API 交互的后台管理系统
- 数据运维工具:数据库迁移、数据查询、批处理操作
- 微服务治理:服务注册发现、配置管理、健康检查
- 本地开发工具:项目脚手架、代码生成器、调试工具
Spring Shell 4.0
这次的 4.0 版本,其实是一次脱胎换骨的升级。下面我们稍微展开聊一下。
与 Spring 生态完美对齐
4.0 版本最大的变化是基于Spring Framework 7和Spring Boot 4构建。这意味着:
- 能够利用最新的 Spring 性能优化
- 与 Spring Cloud 2025.0 等新版组件无缝协作
- 支持 Java 17+ 的最新语言特性
其它的还有一些底层类库的配套升级等,整体上这一条属于是常规升级。
革命性的命令模型
新版本的命令模型彻底重构,开发体验更加直观。
在 3.x 的旧方式中,类似@ShellMethod、@ShellOption这类注解被抛弃了。
@ShellComponent
public class LegacyCommands {
@ShellMethod("Say hello")
public String hello(@ShellOption String name) {
return "Hello " + name;
}
}
最新的 4.0 中的新方式(4.0)如下所示。
@Component
public class ModernCommands {
@Command(name = "hello", description = "Say hello to someone")
public String hello(
@Option(shortName = 'n', longName = "name", defaultValue = "World") String name
) {
return "Hello " + name;
}
}
4.0 版本,提供了新的@Command和@Option注解,这点和我们常见的命令行模式非常的接近了。其中的变化亮点在于:
- 语义更清晰:
@Command和@Option比@ShellMethod和@ShellOption更贴近 CLI 术语 - 属性更统一:所有命令配置集中在
@Command注解中 - 支持命令分组:通过
group属性实现命令分类
支持 jSpecify Null Safety
不了解 jSpecify Null Safety 的,可以阅读我的这篇文章《https://mp.weixin.qq.com/s/8KDYRmu1j8wMV0PmBd_Ong》。
这次的 4.0 全面采用jSpecify注解(如@NonNull、@Nullable),这也是 Spring Framework 7 引入的 null 安全规范。这个类库带来的好处是:
- 编译期检测潜在的 NullPointerException
- IDE 智能提示更加精准
- 代码可维护性显著提升
据统计,约 30% 的生产环境 bug 与空指针异常相关,这一改进将极大提升 CLI 应用的稳定性。
模块化架构
模块化现在被越来越多的提及,这次 GA 的 4.0 版本,支持模块化架构,按需组合,轻装上阵。
4.0 对模块体系进行了大刀阔斧的重构:
| 旧模块(3.x) | 新模块(4.0) | 变化说明 |
|---|---|---|
| spring-shell-core | spring-shell-core | 移除对 Spring Boot 和 JLine 的强制依赖 |
| spring-shell-standard | spring-shell-core | 功能合并,简化依赖 |
| spring-shell-standard-commands | spring-shell-core | 功能合并,简化依赖 |
| spring-shell-table | spring-shell-jline | 迁移至 JLine 模块 |
| spring-shell-autoconfigure | spring-shell-core-autoconfigure | 重命名,语义更清晰 |
| – | spring-shell-jline | 可选的 JLine 控制台支持 |
后面,几乎所有的 Java 生态框架,都会朝着模块化的方向靠齐。Spring shell 4.0 支持模块化的核心优势在于。
- spring-shell-core 现在只依赖 JDK 的
java.io.Console,体积更轻 - 非 Spring Boot 项目使用更灵活
- 真正需要的功能才引入对应依赖
命令补全的颠覆性改进
用过 3.x 的都知道,3.x 的一大痛点是无法实现跨选项的智能补全。例如,选择“性别”后,自动过滤对应的名字列表。
4.0 的解决方案举例如下。
@Command(name = "hello", completionProvider = "helloCompletionProvider")
public void sayHello(
@Option(shortName = 'g', longName = "gender") Gender gender,
@Option(shortName = 'n', longName = "name") String name
) {
// 实现逻辑
}
@Bean
public CompletionProvider helloCompletionProvider() {
return context -> {
// 根据已输入的gender值,提供不同的name建议
// 实现真正的智能补全
return getGenderBasedNames(context.getOptionValue("gender"));
};
}
这一改进让 CLI 工具的用户体验接近现代化的 Shell(如 zsh 的插件系统)。
包结构调整
所有 API 包名从org.springframework.shell迁移到org.springframework.shell.core,确保 IDE 的自动导入功能已更新。
升级实战指南
综合上面的内容,如果要升级到 4.0 版本,不仅仅是相关依赖上的改动,还需要对某些代码实现上做调整。下面是官方给出的从 3.x 到 4.0 的升级指南。推荐大家多去阅读官方迁移指南https://github.com/spring-projects/spring-shell/wiki/v4-migration-guide。
首先是,Maven 依赖调整。
<!-- 旧配置(3.x) -->
<dependency>
<groupId>org.springframework.shell</groupId>
<artifactId>spring-shell-starter</artifactId>
<version>3.4.0</version>
</dependency>
<!-- 新配置(4.0) -->
<dependency>
<groupId>org.springframework.shell</groupId>
<artifactId>spring-shell-starter</artifactId>
<version>4.0.0</version>
</dependency>
<!-- 如需使用JLine的高级功能 -->
<dependency>
<groupId>org.springframework.shell</groupId>
<artifactId>spring-shell-jline</artifactId>
<version>4.0.0</version>
</dependency>
接下来是代码迁移的要点。
比如,注解替换。
// 3.x
@ShellComponent → @Component
@ShellMethod → @Command
@ShellOption → @Option
在比如,命令类结构。
// 4.0不再支持
@Command // 错误!不能标注在类上
class InvalidStructure { }
// 正确做法
@Component // 使用标准Spring注解
public class ValidStructure {
@Command(name = "mycommand")
public void execute() { }
}
启用命令扫描不再需要@CommandScan。
// Spring Boot项目不再需要@CommandScan
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
// 启动类中的命令自动生效
@Command
public void hi() {
System.out.println("Hello!");
}
}
然后是对应的 API 包需要调整,以及选项定义简化。
// 3.x支持多个长名称
@ShellOption(value = {"--verbose", "--debug"}) boolean verbose
// 4.0只允许单个短名称和单个长名称
@Option(shortName = 'v', longName = "verbose") boolean verbose
结语
Spring Shell 4.0 是一次诚意满满的重大升级。它不仅带来了现代化的 API 设计和更强的类型安全,更重要的是让开发者能够以最“Spring”的方式构建命令行应用。
随着模块化的推进,在仅使用spring-shell-core + spring-context的情况下,启动时间可以缩小到小于 1 秒,同时相比 3.x 减少约 30% 的内存占用。
参考资料
https://docs.spring.io/spring-shellhttps://github.com/spring-projects/spring-shell- 迁移指南:
https://github.com/spring-projects/spring-shell/wiki/v4-migration-guide

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » Spring Shell 4.0 正式发布,终于解决了命令智能补全这个老大难!