Java 21和Spring Boot 3升级笔记(一)工程基线整理

发表于 2024-09-06 22:18 1066 字 6 min read

Spring AI学习笔记(四)工具调用和MCPSpring AI学习笔记(三)RAG从文档入库到回答Spring AI学习笔记(二)ChatClient从怎么调到怎么封装Spring AI学习笔记(一)它到底解决什么问题java新版本-java25学习笔记(四)用JFR和GC日志做一次体检java新版本-java25学习笔记(三)虚拟线程要和资源边界一起看java新版本-java25学习笔记(二)运行时基线先统一java新版本-java25学习笔记(一)LTS版本对比和学习路线主流AI Agent能力对比与工程选型我用Kiro做了个自己的工具站盘一盘虚拟线程我用Trae做了个AstrBot的AI角色扮演插件Python初学笔记(六)常用标准库先学这几个Python初学笔记(五)读写文件和处理异常Python初学笔记(四)函数让代码开始有结构Python初学笔记(三)条件、循环和推导式Python初学笔记(二)变量和基础类型比想象中重要Python初学笔记(一)先把环境和运行方式弄明白主流AI大模型能力对比Java 21和Spring Boot 3升级笔记(五)日志指标与可观测性Java 21和Spring Boot 3升级笔记(四)数据访问层适配Java 21和Spring Boot 3升级笔记(三)虚拟线程使用边界Java 21和Spring Boot 3升级笔记(二)Jakarta迁移要点Java 21和Spring Boot 3升级笔记(一)工程基线整理魔法値をどうやって我慢する?JPAのSpecification大改造!处理生僻字乱码:JPA框架对于Oracle的NVarchar2,NChar,NClob类型支持Redis Stream能不能当轻量消息队列用RocketMQ 5学习笔记:普通消息之外要看什么事件流不是换个消息队列这么简单Kubernetes学习笔记04:发布、排障和观测Kubernetes学习笔记03:配置、密钥和存储Kubernetes学习笔记02:Deployment、Service和IngressKubernetes学习笔记01:Pod和控制器mysql索引原理02--存储引擎索引的实现mysql索引原理01--索引的数据结构
この投稿は「日本語」では表示できません。元の投稿を表示しています。
  2024 年再看 Java 后端项目,绕不开两个关键词:Java 21 和 Spring Boot 3。   Java 21 是新的 LTS 版本,虚拟线程、Record Pattern、Sequenced Collection 这些能力都在把 Java 往更现代的方向推。Spring Boot 3 则把底层基线抬到了 Java 17 以上,同时全面切到...

前言

  2024 年再看 Java 后端项目,绕不开两个关键词:Java 21 和 Spring Boot 3。

  Java 21 是新的 LTS 版本,虚拟线程、Record Pattern、Sequenced Collection 这些能力都在把 Java 往更现代的方向推。Spring Boot 3 则把底层基线抬到了 Java 17 以上,同时全面切到 Jakarta EE 命名空间。

  但真正升级项目时,不能只看“能不能跑起来”。我的感觉是,第一步应该先把工程基线理顺。JDK、Maven、依赖版本、构建插件、运行镜像这些东西如果没统一,后面排查问题会很累。

先确认为什么要升级

  升级前最好先问清楚目标。是为了用 Java 21 的新特性?是为了跟上 Spring Boot 3 生态?还是因为老版本依赖安全风险太多?

不同目标会影响升级方式。

如果只是为了安全修复,可以先小步升级 Spring Boot 2.7 的补丁版本,再准备大版本迁移。如果是新项目,就没必要再从老基线开始,直接用 Java 21 和 Spring Boot 3 会更干净。

我比较不建议只因为“别人都升了”就改生产项目。技术升级一定会有成本,尤其是涉及框架大版本时,测试和回归要留足时间。

JDK 版本要统一

  项目里最怕的是开发环境、CI 环境、生产环境用的 JDK 不一致。

比如本地用 Java 21,CI 还在 Java 17,生产镜像是某个旧的 11 版本。这种情况下,有些问题只有上线后才暴露。

我会先把版本写清楚:

<properties>
    <java.version>21</java.version>
    <maven.compiler.release>21</maven.compiler.release>
</properties>

然后再检查 CI 配置和 Dockerfile。

FROM eclipse-temurin:21-jre

不一定非要用这个镜像,但要明确生产运行时到底是什么 JDK。不要只在文档里写“需要 Java 21”,实际构建脚本里却没有约束。

Maven 也要一起看

  升级 Java 版本时,Maven 插件经常会被忽略。

比如maven-compiler-pluginmaven-surefire-pluginmaven-jar-plugin这些插件如果太旧,可能会遇到奇怪的问题。尤其是测试插件,老版本对新 JDK 的支持不一定好。

一个简单的编译插件配置可以这样:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <release>21</release>
    </configuration>
</plugin>

如果是多模块项目,最好统一放在父工程的pluginManagement里。不要每个子模块自己写一套版本,不然后面会出现同一个项目里构建行为不一致。

依赖不要一次乱升

  升级 Spring Boot 3 时,很容易顺手把所有依赖都升到最新。这个做法看起来省事,但风险很高。

我的习惯是先让 Spring Boot 的依赖管理接管大部分版本。能不手写版本就不手写,尤其是 Jackson、Tomcat、Hibernate、Validation 这些和 Boot 强相关的库。

如果项目里有很多显式版本,可以先整理一遍:

1.必须固定版本的保留。 2.Spring Boot 已经管理的去掉。 3.长期不用的依赖删除。 4.内部组件单独列清楚兼容范围。

这一步很枯燥,但很有用。依赖越干净,大版本升级时越容易知道问题来自哪里。

配置也要做一次清理

  很多项目的application.yml里会留下历史配置。有些配置在新版本里已经改名,有些配置早就不生效了。

升级时可以顺手做一次清理。比如服务端口、连接池、日志、Actuator、序列化配置,都要看一遍。

我一般会特别关注这几类:

1.数据库连接池配置。 2.JPA 或 MyBatis 配置。 3.日志级别和日志格式。 4.Actuator 暴露端点。 5.序列化时间格式。

这些配置都和运行行为有关,不要只盯着启动是否成功。

小结

  Java 21 和 Spring Boot 3 的升级,不是把版本号一改就结束。工程基线如果没理顺,后面每一步都会变得不确定。

  我的建议是先统一 JDK、构建插件、依赖管理和运行镜像,再开始处理框架兼容问题。基础打稳以后,后面改 Jakarta、数据访问和线程模型,心里会有底很多。

気に入ったならばコメントを残してくださいね~

© 2019 - 2026 VincentHo @VincentHo
Powered by theme astro-koharu · Inspired by Shoka