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 標(biāo)志。
? 2. 改造編譯器
- 修改 pom.xml 或 build.gradle: xml復(fù)制編輯<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> 或 Gradle: gradle復(fù)制編輯java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 }
? 3. CI/CD 和容器環(huán)境準備
- 本地、Jenkins、Docker 鏡像全部要換成 openjdk:17,不要只本地換了。
- 若有 alpine 鏡像,優(yōu)先選 eclipse-temurin 官方鏡像,或者 adoptopenjdk 替代。
?? 3?? 檢查常見代碼層面問題
? 1. 移除廢棄 API
Java 9+ 移除了一些老的 API,比如:
- javax.xml.bind (JAXB) → 需要單獨引入 jakarta.xml.bind。
- javax.annotation → 改用 jakarta.annotation。
? 2. 模塊化影響
- Java 9 引入了 JPMS(模塊系統(tǒng)),雖然可以用 --illegal-access=permit 來兼容,但長遠看要顯式聲明 --add-opens 或者模塊依賴,某些反射或 SPI 需要改造。
? 3. 字節(jié)碼工具 & 熱加載
- Lombok:要使用支持 Java 17 的版本(1.18.20+)。
- ASM、ByteBuddy、CGLIB 也需要更新。
? 4. GC 行為變了
- CMS 被標(biāo)記為廢棄,默認改用 G1 GC。
- 如果對延遲敏感,研究 G1、ZGC、Shenandoah,結(jié)合 JVM 參數(shù)調(diào)優(yōu)。