JDK版本升級,通常引入新的語言特性、新的API,廢棄一些API,從而導致一些不相容的現象。
因此在升級產品使用的JDK版本時,通常有如下考慮:
- 新產品包括新建設的專案以及剛啟動不久的專案,使用高版本的JDK。
- 對於生命週期中間的產品,依據人力預算和團隊的技能,決策是否升級。
- 對於進入生命週期尾部的產品,則建議維持現有的JDK版本,不進行升級工作。
升級JDK前,完整梳理涉及的變更項,有助於準確評估升級所需的工作量。
升級JDK時,提前就如下事項,進行評估:
升級JDK版本的目的
明確升級的目的,比如提升開發效率、改善應用執行時的效率、提升團隊技能準備度、客戶的明確要求等,有助於縮小備選的版本集合,快速做出選型的決策。
就升級目的和收益,和客戶、管理團隊、研發團隊統一認識,達成一致。
開發環境
- IDE的選型,當前在用的低版本的IDE可能不支援高版本的JDK,因此需要同步更新版本。
- 構建工具,比如專案當前使用maven來構建產品,部分外掛可能依賴JDK的版本,因此需要同步升級。
- 靜態檢查工具,低版本的檢查工具可能無法識別高版本JDK引入的新語法,因此需要升級或者重新選型。
- 除錯工具,比如記憶體檢查和分析工具、一些Profile的工具,可能需要同步升級或者重新選型。
- UT用例,比如Mock框架,可能需要同步升級或者重新選型,這涉及到已有UT程式碼的整改。
構建流水線
- 流水線軟體,比如Jenkins,統一JDK版本,有助於簡化環境的配置,同時複用升級JDK帶來的紅利。
- 靜態檢查工具,和開發環境中使用的程式碼靜態工具的版本和規則需要匹配,二者同步升級。
- 自動化測試用例
產品原始碼
- 原始碼中涉及語言、API的相容性修改
- 開源軟體,選用相容高版本JDK的版本,或者重新選型
- 指令碼,比如安裝、解除安裝、啟動、停止指令碼等
驗證工作
- 功能驗證
- 安裝/解除安裝/執行/停止/升級/回退
- 業務功能
- 效能測試
- 資源消耗,觀察CPU、記憶體
- 業務表現,比如吞吐量、時延、併發度
- JVM表現,比如GC次數、GC時延、GC日誌
- 長穩測試
周邊配套系統
運營、運維等系統,和產品一起完成整改。
生產變更
提前演練,準備好應對預案。
完成上述梳理,算是好的開始,後續仍需制訂執行計劃,有序開展工作,跟蹤各任務的進度,在預期時間內完成升級的工作,達成升級的目標。
AI的答案
如下是百度生成的答案,質量還不錯,文筆、措辭的質量不錯。
JDK(Java Development Kit)的升級是一個涉及多個方面的過程,包括版本選擇、依賴更新、程式碼相容性檢查、測試以及查閱官方文件和社群支援。以下是一些關鍵的步驟和注意事項:
版本選擇
- 推薦升級到最新穩定版本,如JDK 17,以利用最新的效能改進和安全更新。
- 考慮專案的相容性和依賴庫的支援情況,確保所選版本與專案的需求相匹配。
依賴更新
- 檢查專案依賴的庫是否支援新版本的JDK,並更新到相容的版本。特別注意那些有強制依賴的庫,如Zookeeper和Curator,它們可能需要特定版本的JDK才能正常工作。
- 對於使用Maven或Gradle等構建工具的專案,更新專案的構建配置檔案(如pom.xml或build.gradle),指定新的JDK版本。
程式碼相容性檢查
- 檢查程式碼中是否有使用已棄用或不再支援的API,並進行相應的修改。
- 利用IDE的提示功能檢查潛在的相容性問題,並進行修復。
測試
- 在升級後進行全面的測試,包括單元測試、整合測試和系統測試,確保功能不受影響。
- 特別注意那些與JDK版本緊密相關的功能模組,如網路程式設計、併發處理等。
文件和社群支援
- 查閱JDK官方文件和社群討論,獲取更多關於升級指導和常見問題的解決方案。
- 利用社群論壇和問答網站(如Stack Overflow)尋求幫助和建議。
透過遵循上述步驟和建議,可以更順利地完成JDK的升級過程,同時最小化潛在的風險和問題。
參考資料
Oracle JDK
- Java Downloads
- Oracle JDK Migration Guide 22
- Oracle JDK Migration Guide 21
- Oracle JDK Migration Guide 17
- Oracle JDK Releases for Java 11 and Later
OpenJDK
- OpenJDK General-Availability Releases
- Red Hat build of OpenJDK
- JEPs in JDK 17 integrated since JDK 11
- JEP 361: Switch Expressions
- JEP 378: Text Blocks
- JEP 394: Pattern Matching for instanceof
- JEP 395: Records
- JEP 409: Sealed Classes
開源軟體
- Spring Framework Versions
- Spring Boot
網友帖子
- 我的一次分享——JDK17
- JDK11升級JDK17最全實踐乾貨來了
- How much faster is Java 17?
- How much faster is Java 15?
- How much faster is Java 11?
- What is the fastest Garbage Collector in Java 8?
- How much faster is Java 8?