[关闭]
@levinzhang 2022-09-29T21:54:25.000000Z 字数 2827 阅读 221

Spring Boot Migrator简介

by

摘要:

Spring Boot Migrator(SBM)是一个实验性的Spring项目,最初发布于2022年3月。SBM允许开发人员将现有的、非Spring Boot应用(基于JAX-RS、EJB和JMS等技术)转换成Spring Boot应用,也可以将较旧的Spring Boot应用升级为最新版本。


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)启动:

  1. java -jar spring-boot-migrator.jar

几秒钟之后,用户可以看到一个专门的SBM提示:migrator:>

list命令能够展示当前可用的30个recipes。比如,其中的recipes能够升级Spring Boot到新版本、将XML bean配置变更为Java配置以及迁移各种Java EE/Jakarta到Spring Boot。

scan [directory]命令能够分析一个应用并展示适用的recipes。如下展示了一个样例,SBM分析了一个比较旧的JAX-RS应用,该应用没有提供对Spring Boot的支持,结果如下所示:

  1. scanning 'JAXRS'
  2. Checked preconditions for '.../JAXRS'
  3. [ok] Found pom.xml.
  4. [ok] 'sbm.gitSupportEnabled' is 'true', changes will be committed to branch [master] after each recipe.
  5. [ok] Required Java version (17) was found.
  6. [ok] Found required source dir 'src/main/java'.
  7. Maven 100% │███████████████████████████│ 2/2 (0:00:09 / 0:00:00)
  8. Applicable recipes:
  9. = 'automated recipe'
  10. = 'partially automated recipe'
  11. = 'manual recipe'
  12. - initialize-spring-boot-migration []
  13. -> Initialize an application as Spring Boot application.
  14. - migrate-jax-rs []
  15. -> Any class has import starting with javax.ws.rs
  16. - cn-spring-cloud-config-server []
  17. -> Externalize properties to Spring Cloud Config Server

基于应用的源码,SBM将会展示与条件相匹配的recipes。如果没有匹配的recipes话,可用recipes的列表将保持为空。此时,我们可以使用其中列出的某个recipes,比如,将现有的代码转换成Spring Boot应用:

  1. migrator:> apply initialize-spring-boot-migration

上述命令将会产生一个新的Git提交,描述为SBM: applied recipe 'initialize-spring-boot-migration'

我们分析一下该提交会发现在pom.xml中有如下变化:打包方式从WAR改变成了JAR、增加了spring-boot-starterspring-boot-starter-test依赖和spring-boot-maven-plugindependencyManagement区域包含了pom类型的spring-boot-dependencies。pom.xml文件的缩进方式可能会与最初有所差异。

源码也会有所变更,现在包含了SpringBootApp.javaSpringBootAppTest.java类:

  1. @SpringBootApplication
  2. public class SpringBootApp {
  3. public static void main(String[] args) {
  4. SpringApplication.run(SpringBootApp.class, args);
  5. }
  6. }
  1. @SpringBootTest
  2. class SpringBootAppTest {
  3. @Test
  4. void contextLoads() {
  5. }
  6. }

现在,应用已经转换成了Spring Boot应用。下一步就是通过如下的命令将JAX-RS源码转换成Spring Boot:

  1. migrator:> apply migrate-jax-rs

该命令会产生一个新的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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注