SpringBoot3的迁移血泪史:我把200个javax包名改成jakarta后
一、史诗级挖坑现场:从「试试看」到「火葬场」
2023年双十一前两周,老气横秋的CTO拍着我肩膀说:「兔哥,咱们把框架升到Spring Boot 3吧,听说性能提升30%呢!」我看着他手机里刚刷到的技术文章,又看了看自己负责的支付系统——那是个从Spring Boot 2.1一路缝缝补补过来的「祖传项目」,里面还躺着JDK 8的古老代码。
「这就像给诺基亚装安卓14。」后端老李当时叼着烟说。现在回想,他说得太保守了——这根本是给自行车装火箭发动机,点火瞬间连人带车炸成烟花。
二、第一颗地雷:满屏飘红的「找不到符号」
执行mvn spring-boot:run
的那一刻,控制台像被泼了番茄汁:
[ERROR] 程序包javax.servlet.http不存在
[ERROR] 找不到符号 HttpServletRequest
[ERROR] 符号: 类 HttpSession
237个错误,全是javax.
开头的包找不到。我这才想起Spring Boot 3.x要求Jakarta EE 9+,所有javax.*
包名都改成了jakarta.*
。就像某天突然被告知「水」字改叫「火」,全中国的字典都得重印。
作死式尝试一:全局替换
我按下了IDE的「替换全部」按钮,把所有javax
换成jakarta
。三分钟后,项目里多了200个改过名的文件,以及一个新问题——pom.xml
里的依赖炸了:
<!-- 原来的依赖 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
Jakarta迁移不仅改包名,连Maven坐标都换了爹。正确姿势应该是:
<!-- 迁移后的依赖 -->
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.0.2</version>
</dependency>
三、连环炸:那些藏在暗处的「定时炸弹」
1. 第三方库的「猪队友」行为
项目里用了个2019年的老JSON工具包fastjson 1.2.68
,它内部硬编码了javax.json
的引用。当我启动服务时,JVM直接给我表演了个「类加载爆炸」:
Caused by: java.lang.NoClassDefFoundError: javax/json/JsonException
解决方案?要么升级到支持Jakarta的版本(fastjson2需要改API),要么换用Jackson。我选了后者,毕竟谁也不想跟一个三年不更新的库谈恋爱。
2. spring.factory 过时了??
项目里有大佬使用spring.factory 实现SpringBoot的自动装配和扩展点注册,这下升级了,指不定哪一天又要歇菜,全部按照最新的org.springframework.boot.autoconfigure.AutoConfiguration.imports 改改改
四、终局之战:用工具链把自己从火葬场捞出来
1. OpenRewrite:批量迁移的救世主
手动改到第89个文件时,我终于醒悟——程序员的尊严是自动化给的。OpenRewrite插件能自动完成:
- 包名替换
- 依赖坐标更新
- 注解参数调整
在pom.xml
里加入插件:
<plugin>
<groupId>org.openrewrite.maven</groupId>
<artifactId>rewrite-maven-plugin</artifactId>
<version>4.40.0</version>
<configuration>
<activeRecipes>
<recipe>org.openrewrite.java.migrate.jakarta.JavaxToJakarta</recipe>
</activeRecipes>
</configuration>
</plugin>
执行mvn rewrite:run
后,插件像个任劳任怨的实习生,默默帮我改完了剩下的111个文件。
五、迁移后的顿悟:技术迭代的残酷浪漫
当服务终于在凌晨四点启动成功时,我看着监控面板上下降了40%的内存占用,突然理解了这场折腾的意义。技术圈就像个渣男,永远在对你说:「下一个版本会更好」——而我们这些程序员,明知可能被伤得遍体鳞伤,还是会忍不住相信。
给准备迁移的朋友三个忠告:
- 别在周五下午开始迁移——除非你想拥有一个难忘的周末
- 先跑
mvn dependency:tree
——看看有多少第三方库在偷偷依赖javax - 准备好速效救心丸——当你发现某个祖传SDK不支持Jakarta时用得上
六、结语:那些被我们改来改去的包名,到底是什么?
从javax
到jakarta
,不过是几个字母的变化,却让整个Java生态阵痛了两年。这让我想起《小王子》里的话:「真正重要的东西,用眼睛是看不见的。」
我们改的哪里是包名?是程序员对「更好」的执念,是技术世界永不停歇的新陈代谢。或许某天,jakarta
也会被新的名字取代,但那时的我们,大概还是会一边骂骂咧咧,一边敲下全局替换的快捷键——毕竟,折腾,才是程序员的宿命啊。
(完)
互动话题:你在技术升级时踩过最离谱的坑是什么?