领先一步
VMware 提供培训和认证,助您加速进步。
了解更多我谨代表团队和所有做出贡献的人,很高兴地宣布 Spring Shell 2.1.0 已发布,并可在 https://repo.spring.io/milestone 获取。
有关更多详细信息,请参阅发布说明。
感谢所有通过问题报告和拉取请求做出贡献的人。
今年早些时候,我们开始努力将项目与最新的 Spring Boot 和 Spring Framework 版本保持一致,因为很难使用现有的 Spring 系列中的 Spring Shell 版本。
最初,我们想解决的主要问题是移除 Spring Boot 现在默认强制执行的 bean 循环。虽然此功能可以关闭,但 Spring Shell 不应要求它。这需要大量更改,我们选择通过重写 shell 内部机制来处理。一个主要的挑战是旧的 Spring Shell 的工作方式,它基本上通过 @ShellMethod 注解支持命令信息方法,然后通过不那么明确的方式使用反射调用这些方法。
现在很明显,我们需要进行一次更大的彻底审查,因此现在进行进一步开发比等待 Spring Shell 最终需要支持的 Spring Boot 3 和 Spring Framework 6 更为合理。
以下是所做更改的摘要:
CommandRegistration 是一种新的以编程方式定义命令的方式。现有的命令注解模型在后台会被翻译成这些注册。这种新的注册模型现在允许我们动态控制命令,这在旧的 shell 实现中是不可能的。
对于 @ShellMethod 和 @ShellOption,我们已尽力保持它们的兼容性,未来的开发很可能会引入与 CommandRegistration 更一致的新注解。
现代终端实现不仅仅是显示简单的文本,它们还支持不同的字体样式,并且可以与颜色一起使用。在旧的 Spring Shell 中,这些大多是硬编码的,尽管可以通过 JLine 使用 ANSI 序列向控制台写入任何内容。因此,引入一个主题系统是有意义的,该系统允许根据选定的样式对写入的文本进行样式化。图形只是现代终端支持的 Unicode 字符,它们是创建漂亮 shell UI 的基础。


你很可能已经使用过各种命令行工具,它们不仅仅是向用户询问一些文本,然后基于此执行操作。例如,GitHub CLI 是一个很好的例子,因为它的一些命令会进入交互模式,并使用选择列表等各种技巧和其他类型的 shell 样式表单向用户索要输入。
我们在 Spring Shell 中想要实现的是创建这些可以独立使用或组合成流程的组件。
Spring Framework 未来版本的一个重要课题是使用GraalVM进行原生编译。这显然对 CLI 产生了重大影响,因为当您现有的代码被转换为原生二进制文件时,那个微小的 jvm 引导超时就会消失。
通过 2.1.x 版本,我们通过实验性的Spring Native项目证明,可以创建一个Spring Shell应用程序,该应用程序在Linux、MacOS和Windows上都能正常工作。



Spring Shell对GraalVM的官方支持将在 3.x 版本中提供。
在终端中编写命令很简单,因为你本质上只需要写一些东西。然而,我们在一些内置命令(如 help)中做的事情并不总是用户想要的,或者他们可能有其他原因来修改它的外观。Spring Shell 的一些默认输出现在基于 ANTRL 项目的 ST4 的模板。
这允许用户替换 Spring Shell 中使用的模板并修改默认行为。这些模板也集成了主题框架,因此可以为每个活动主题定义模板。