您是否感到Java的版本與更新版號很混亂,無所適從呢?經常出現的更新提示時常讓您不禁想著「我不是才剛點過更新嗎?」,Java版本號碼以及更新的頻率到底是怎麼一回事呢?這篇文章將帶您深入了解Java版本與更新頻率。
原來Java更新有眾多來源可以使用
一直以來,大家都習慣Oracle為大家提供的Java定期免費更新,而且使用Java時,往往下載最新版的更新便能使用,相同版本而不同更新的狀況下很少會碰到版本相容性的問題,這主要歸功於Java程式碼與更新檔本身大量的內容重複以及大幅度簡化新版本遷移的過程,而實際更新過程就是重新安裝整個Java而不是版本差異更新。
除了Oracle外,也有許多OpenJDK的社群與廠商會定期提供Java更新,Azul也是其中之一。自從Oracle開始對Java的企業用戶收費之後,企業用戶紛紛轉向OpenJDK,與此同時,人們也容易對Java、JDK、OpenJDK的軟體名稱、更新頻率與版本號碼感到困惑。原因在於Oracle對於安全更新以及錯誤的修復程式碼只上傳到「當前」的OpenJDK儲存庫中(現在2022年7月就是JDK 18),而將安全修復程式碼向下移植(主要是移植到LTS版本)則是仰賴於社群以及OpenJDK廠商來完成。
OpenJDK的社群與廠商
Java有設定一個官方專案叫OpenJDK,這個專案目的是提供Java規格的參考實作,目前這個專案由Oracle負責營運,同時由許多著名的社群與廠商共同維護。這些社群與廠商在維護同時,也會推出屬於自己版本的建構版(build),OpenJDK專案提供的下載連結也是連到社群的建構。也就是說,大家熟知的Oracle Java SE是OpenJDK專案的一個分支建構。
Java的更新規則
自從2017年的Java 9之後,Java更新頻率為每季一次,且版本號碼每半年推進一次,同時表定LTS版本每兩年一次,因此Java 8之前所有版本都是LTS,Java 9 之後開始出現非LTS的版本號碼。目前已釋出的LTS是Java 8、Java 11、Java 17,下一個LTS預定在2023年釋出Java 21。Java的Roadmap已經規劃好到2024年的每一個版本更新號碼。
也因此,Java除了新版本號碼的累進(如Java 9、Java 10、 Java 11等等),同時有LTS的橫向累積(如7u272、8u201、11.0.1、17.0.2),值得注意的是LTS版本號碼也從Java 9 開始不再接update(標示時以u做代表,如8u341),而是以.0.1、.0.2的方式進行。
什麼是LTS?
LTS是Long-term support的縮寫,多用在Open source軟體,因為相較於大多數商用軟體,Open source軟體較常有功能上的變動,可能過半年就找不到之前用過的某項功能。但這並不適合需要穩定運作的商用環境,因此開發商會選定特定版本作為LTS的維護標的,通常至少會2年以上,該版本發現安全性或Bug需要修正時,會同時對該版本進行維護,而不是只修復在最新的版本而強迫升版。同時,許多開發商為了必要的營利,要求使用者合法使用LTS軟體的後續Support是收費服務。
此外,還有Oracle的規則
除了版號與時程外,讓事情更複雜的是,Java的更新是以Oracle的規則在進行,而Oracle所有產品的更新引入了兩個階段,CPU與PSU,分別指的是Critical Patch Update與Patch Set Update。
編碼規範是CPU尾數為奇數,PSU尾數為偶數,這解釋了為什麼會有8u201(CPU)與8u202(PSU)。同時Java 9之後 OpenJDK社群不再標示PSU,僅Oracle Java SE與Azul標示CPU。
按照Oracle的其他產品(如資料庫)的更新規則可以視為CPU是現行版本的安全更新,打包CPU以及其他功能成為PSU,測試一段時間沒問題就可能會將新的部分加入下一次CPU或大型版本更新。如此Oracle的客戶們能根據求穩定或求新功能選擇更新。此外CPU與PSU的實際使用有一些規定,並不適用於Java,我們下次再分享。
到了Java狀況又有些不同。Java每個更新檔其實都是完整安裝檔,CPU或PSU都是完整的Java環境,不只是Patch。 然而,又因為是否為Java SE訂閱戶而有所差異,觀察到Oracle 從2019年至今的Java更新策略,可以發現最近幾年Oracle 提供給訂閱用戶的Oracle Java SE 只有 CPU更新,沒有PSU更新,同時讓OpenJDK社群釋出PSU更新,沒有釋出CPU更新。這個落差,因為釋出更新時也公開了所修復的漏洞訊息,可能造成CPU與PSU釋出的時間差而產生的零時差漏洞。
OpenJDK社群釋出的PSU更新,其穩定度可能也不如CPU更新。例如社群提供的PSU更新曾在2020年10月20號釋出的8u272,有造成伺服器crash的風險,在隔月5號緊急釋出8u275,Oracle在同時釋出的8u271(CPU)則不受任何影響。
接著來看提供CPU更新的另一家廠商-Azul。Azul是全世界唯二提供Java CPU更新的另一間廠商,其訂閱資格Azul platform core的CPU更新檔提供速度完全與Oracle同步,讓OpenJDK使用者在選擇更新時,不需面臨大量的回歸測試,僅需要開箱替換即可。此外,針對LTS中間的奇數號版本,也獨家定義了MTS(Medium Term Support),例如Java 13、Java 15及未來的Java 19,提供至少兩年半的Support(原本只有半年),提供這些版本的CPU更新。剛才所提到的各種PSU風險,若使用Azul的CPU更新,也如同使用Oracle的CPU更新一樣不存在。此外,對於表定已經EOS的Java 6, Java 7,也獨家持續提供支援至2027年12月。
總結:Java更新策略
目前Java更新有CPU更新與PSU更新兩種,CPU更新都是訂閱戶才能取得。CPU更新為當前版本的關鍵更新,通常是根據上次的PSU更新而來,如此可以確保安全。PSU為這次釋出的CPU更新以及額外的更新,有時候會晚CPU釋出,也能有發生過重大問題而再次緊急釋出的狀況。因此更新策略總結如下:
Java專家-Azul
Azul,2002年成立於美國加州,是目前Java供應商中唯一100%專注於Java的公司。Azul的商業授權訂閱確保使用者一定能如期取得經過 JCK 測試的季修補,同時也是唯一提供無授權汙染保證的公司,確保您的智慧財產權不受病毒式授權的汙染。全世界已有數以百萬計的 Java 開發人員、數以億計的設備及世界上最受推崇的企業信任 Azul, 將以卓越的功能、性能、安全性、最經濟實惠的價格與最高等級的支援服務,支持著您的Java應用程式的運行。
參考資料來源: