2?? 升級(jí)前,你需要準(zhǔn)備什么?
? 1. 先升級(jí)所有依賴
- 絕不能直接 JVM 換了就跑,要先確認(rèn): Spring/Spring Boot 版本是否支持 Java 17(Spring Boot 2.7+/3.x 推薦)。 Hibernate、MyBatis、Jackson 等 ORM/JSON 庫(kù)是否兼容。 老的 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)境準(zhǔn)備
- 本地、Jenkins、Docker 鏡像全部要換成 openjdk:17,不要只本地?fù)Q了。
- 若有 alpine 鏡像,優(yōu)先選 eclipse-temurin 官方鏡像,或者 adoptopenjdk 替代。
?? 3?? 檢查常見(jiàn)代碼層面問(wèn)題
? 1. 移除廢棄 API
Java 9+ 移除了一些老的 API,比如:
- javax.xml.bind (JAXB) → 需要單獨(dú)引入 jakarta.xml.bind。
- javax.annotation → 改用 jakarta.annotation。
? 2. 模塊化影響
- Java 9 引入了 JPMS(模塊系統(tǒng)),雖然可以用 --illegal-access=permit 來(lái)兼容,但長(zhǎng)遠(yuǎn)看要顯式聲明 --add-opens 或者模塊依賴,某些反射或 SPI 需要改造。
? 3. 字節(jié)碼工具 & 熱加載
- Lombok:要使用支持 Java 17 的版本(1.18.20+)。
- ASM、ByteBuddy、CGLIB 也需要更新。
? 4. GC 行為變了
- CMS 被標(biāo)記為廢棄,默認(rèn)改用 G1 GC。
- 如果對(duì)延遲敏感,研究 G1、ZGC、Shenandoah,結(jié)合 JVM 參數(shù)調(diào)優(yōu)。