跳到主要内容

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%的内存占用,突然理解了这场折腾的意义。技术圈就像个渣男,永远在对你说:「下一个版本会更好」——而我们这些程序员,明知可能被伤得遍体鳞伤,还是会忍不住相信。

给准备迁移的朋友三个忠告:

  1. 别在周五下午开始迁移——除非你想拥有一个难忘的周末
  2. 先跑mvn dependency:tree——看看有多少第三方库在偷偷依赖javax
  3. 准备好速效救心丸——当你发现某个祖传SDK不支持Jakarta时用得上

六、结语:那些被我们改来改去的包名,到底是什么?

javaxjakarta,不过是几个字母的变化,却让整个Java生态阵痛了两年。这让我想起《小王子》里的话:「真正重要的东西,用眼睛是看不见的。」

我们改的哪里是包名?是程序员对「更好」的执念,是技术世界永不停歇的新陈代谢。或许某天,jakarta也会被新的名字取代,但那时的我们,大概还是会一边骂骂咧咧,一边敲下全局替换的快捷键——毕竟,折腾,才是程序员的宿命啊。

(完)

互动话题:你在技术升级时踩过最离谱的坑是什么?