Spring Boot Migrator(SBM)是一个实验性的 Spring 项目,最初发布于 2022 年 3 月。SBM 允许开发人员将现有的、非Spring Boot应用(基于JAX-RS、EJB和JMS等技术)转换成Spring Boot应用,也可以将较旧的 Spring Boot 应用升级为最新版本。
SBM 是基于OpenRewrite实现的,这是一个用于源码和配置重构的通用工具。OpenRewrite 使用Recipes修改现有的 Kubernetes、Gradle、Maven、Java 等文件。例如,借助 recipes 能够将现有的应用升级为较新的 Java 版本。SBM 使用 OpenRewrite 实现 Spring Boot 的迁移。
下载最新版本的 SBM 之后,可以使用命令行界面(CLI)启动:
几秒钟之后,用户可以看到一个专门的 SBM 提示:migrator:>
。
list
命令能够展示当前可用的 30 个 recipes。比如,其中的 recipes 能够升级 Spring Boot 到新版本、将 XML bean 配置变更为 Java 配置以及迁移各种 Java EE/Jakarta 到 Spring Boot。
scan [directory]
命令能够分析一个应用并展示适用的 recipes。如下展示了一个样例,SBM 分析了一个比较旧的JAX-RS应用,该应用没有提供对 Spring Boot 的支持,结果如下所示:
基于应用的源码,SBM 将会展示与条件相匹配的 recipes。如果没有匹配的 recipes 话,可用 recipes 的列表将保持为空。此时,我们可以使用其中列出的某个 recipes,比如,将现有的代码转换成 Spring Boot 应用:
上述命令将会产生一个新的 Git 提交,描述为 SBM: applied recipe 'initialize-spring-boot-migration'。
我们分析一下该提交会发现在 pom.xml 中有如下变化:打包方式从 WAR 改变成了 JAR、增加了spring-boot-starter
、spring-boot-starter-test
依赖和spring-boot-maven-plugin
、dependencyManagement
区域包含了 pom 类型的 spring-boot-dependencies。pom.xml 文件的缩进方式可能会与最初有所差异。
源码也会有所变更,现在包含了 SpringBootApp.java 和 SpringBootAppTest.java 类:
现在,应用已经转换成了 Spring Boot 应用。下一步就是通过如下的命令将 JAX-RS 源码转换成 Spring Boot:
该命令会产生一个新的 Git 提交,其描述为:SBM: applied recipe 'migrate-jax-rs'. 分析该提交可以看出,JAX-RS 的导入被删除,取而代之的是导入了 Spring、类文件上的 JAX-RS @Path
注解被 Spring Boot 的@RestController
和@RequestMapping
取代。各个方法现在都有 Spring Boot 的@RequestMapping
、@RequestParam
、@PathVariable
注解,以替换 JAX-RS 的注解,如@Get
、@Post
、@Path
、@Produces
、@QueryParam
和@PathParam
。最后,这些方法的返回值不再是Response
类型,而是ResponseEntity
类型。
遗憾的是,迁移后运行该 Spring Boot 应用失败了,这是因为 pom.xml 文件中定义的maven-compiler-plugin使用了旧版本的 Java。手动修改 pom.xml 文件以使用当前安装的 Java 版本可以解决这个问题,也可以通过 OpenRewrite 的Change Maven插件配置来自动完成这个步骤。
分析产生的代码和配置,我们可能会发现一些 Spring Boot 不再需要的依赖。可以手动删除这些过时的依赖,也可以通过 SBM 或 OpenRewrite 自动完成这一步骤。
SBM 目前支持仅 Maven,因为 OpenRewrite 对 Gradle 的支持还没有完成。关于 SBM 的更多信息可以参阅其用户文档和开发者文档。
原文链接:
Introducing Spring Boot Migrator
相关阅读:
评论