2️⃣ 升级前,你需要准备什么?
✔ 1. 先升级所有依赖
- 绝不能直接 JVM 换了就跑,要先确认: Spring/Spring Boot 版本是否支持 Java 17(Spring Boot 2.7+/3.x 推荐)。 Hibernate、MyBatis、Jackson 等 ORM/JSON 库是否兼容。 老的 Servlet 容器(Tomcat)版本是否兼容。 Maven/Gradle 插件版本是否支持 JDK 17 的 release 标志。
✔ 2. 改造编译器
- 修改 pom.xml 或 build.gradle: xml复制编辑<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> 或 Gradle: gradle复制编辑java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 }
✔ 3. CI/CD 和容器环境准备
- 本地、Jenkins、Docker 镜像全部要换成 openjdk:17,不要只本地换了。
- 若有 alpine 镜像,优先选 eclipse-temurin 官方镜像,或者 adoptopenjdk 替代。
🔍 3️⃣ 检查常见代码层面问题
✅ 1. 移除废弃 API
Java 9+ 移除了一些老的 API,比如:
- javax.xml.bind (JAXB) → 需要单独引入 jakarta.xml.bind。
- javax.annotation → 改用 jakarta.annotation。
✅ 2. 模块化影响
- Java 9 引入了 JPMS(模块系统),虽然可以用 --illegal-access=permit 来兼容,但长远看要显式声明 --add-opens 或者模块依赖,某些反射或 SPI 需要改造。
✅ 3. 字节码工具 & 热加载
- Lombok:要使用支持 Java 17 的版本(1.18.20+)。
- ASM、ByteBuddy、CGLIB 也需要更新。
✅ 4. GC 行为变了
- CMS 被标记为废弃,默认改用 G1 GC。
- 如果对延迟敏感,研究 G1、ZGC、Shenandoah,结合 JVM 参数调优。