@levinzhang
2022-09-30T05:54:25.000000Z
字数 2827
阅读 378
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)启动:
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的支持,结果如下所示:
scanning 'JAXRS'
Checked preconditions for '.../JAXRS'
[ok] Found pom.xml.
[ok] 'sbm.gitSupportEnabled' is 'true', changes will be committed to branch [master] after each recipe.
[ok] Required Java version (17) was found.
[ok] Found required source dir 'src/main/java'.
Maven 100% │███████████████████████████│ 2/2 (0:00:09 / 0:00:00)
Applicable recipes:
= 'automated recipe'
= 'partially automated recipe'
= 'manual recipe'
- initialize-spring-boot-migration []
-> Initialize an application as Spring Boot application.
- migrate-jax-rs []
-> Any class has import starting with javax.ws.rs
- cn-spring-cloud-config-server []
-> Externalize properties to Spring Cloud Config Server
基于应用的源码,SBM将会展示与条件相匹配的recipes。如果没有匹配的recipes话,可用recipes的列表将保持为空。此时,我们可以使用其中列出的某个recipes,比如,将现有的代码转换成Spring Boot应用:
migrator:> apply initialize-spring-boot-migration
上述命令将会产生一个新的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类:
@SpringBootApplication
public class SpringBootApp {
public static void main(String[] args) {
SpringApplication.run(SpringBootApp.class, args);
}
}
@SpringBootTest
class SpringBootAppTest {
@Test
void contextLoads() {
}
}
现在,应用已经转换成了Spring Boot应用。下一步就是通过如下的命令将JAX-RS源码转换成Spring Boot:
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的更多信息可以参阅其用户文档和开发者文档。