我該用 Java 12 還是堅持 Java 11?
搭上火箭也追不上的 Java 更新速度,不少程式設計師們大呼,我可不可以堅持使用 Java 8?!但是對於已使用到 LTS 版本的 Java 11 開發者,是否還有必要往上升級?
本文經授權轉自開源中國
距離 Java 11 的正式釋出已過去一個多月,而 Java 12 也正在趕來的路上。根據此前開源中國發起的一項關於開發者使用的 Java 版本的調查(https://www.oschina.net/question/2918182_2287320)顯示,Java 8 仍然是開發者的主流選擇,而 Java 11 是 Java 8 之後的首個 LTS 版本,所以有不少開發者表示會選擇升級至 Java 11。按照 Java 的釋出計劃,Java 12 將於明年 3 月推出,那麼問題來了,我們是應該採用 Java 12,還是堅持使用 Java 11 呢?
可能你會覺得這是一個無關緊要的問題,但對於那些需要在 JVM 中使用 Java 的開發者,或是比較看重 Java 新特性的開發者,這是一項十分重要的決策。這篇文章將和大家就這個問題進行相關的分析。
Java 釋出計劃
現在每六個月就會釋出一個新的 Java 版本,所以儘管 Java 11 才釋出不久,但距離 Java 12 的釋出也就剩下不到五個月的時間。作為釋出計劃的一部分,某些版本會被指定為長期支援版本(LTS),它們會獲得四年或更長時間的技術支援和安全補丁。所以這些版本通常會被稱為“主要版本” —— 不是因為它們擁有更多的功能特性,而是因為它們具有長期的技術支援。
預計 Java 11 的更新補丁(11.0.1, 11.0.2, 11.0.3 等)將比 Java 8 的補丁(8u20, 8u40, 8u60)更小更簡單。因為 Java 11 的更新將更加集中在安全補丁上,不會像 Java 8 的更新那樣帶來內部的功能增強。因為 Oracle 希望將 Java 12, 13, 14 等這些版本當做是小更新版本,類比成 Java 8 的話,即是 Java 11u20, 11u40。
Oracle 高階員工一再認為像 8u20 和 8u40 這樣的更新常常會帶來破壞性的變更,但本文作者表示這不是自己的經歷,他記得的唯一有破壞性的變化是為 Javadoc 新增了 --allow-script-in-comments,但它也不是 Java 的核心部分。因此,他從不擔心升級到最新版本帶來的影響 —— 因為這是 Java 平臺的核心優勢。
下面深入瞭解一下為什麼在舊的釋出模式下,升級版本不會導致任何問題。先看一下新舊釋出模式之間的差異:
Oracle 的官方觀點認為:與 Java 7->8->9 相比,Java 9->10->11的升級和 8->8u20->8u40 更相似。
表格清楚地顯示新模式下的 Java 版本釋出都會包含許多變更,包括語言變更和 JVM 變更,這兩者都會對 IDE、位元組碼庫和框架產生重大影響。此外,不僅會新增其他 API,還會有 API 被刪除(這在 Java 8 之前沒有發生過)。
Oracle 的觀點是,因為每個版本僅在前一個版本釋出後的 6 個月推出,所以不會有太多新的“東西”,因此升級並不困難。雖然如此,但這不是重點。重要的是升級是否有可能會破壞程式碼。很明顯,從 11 -> 12 -> 13 開始,程式碼遭受破壞的可能性要大於 8 -> 8u20 -> 8u40。
11 -> 12 -> 13 與 8u20 -> 8u40 等這樣的更新主要區別在於對位元組碼版本的更改以及對規範的更改,對位元組碼版本的更改往往特別具有破壞性,大多數框架都大量使用與每個位元組碼版本密切相關的 ASM 或 ByteBuddy 等庫。而 8u20 -> 8u40 仍然使用相同的 Java SE 規範,具有所有相同的類和方法,不同於從 Java 12 移動到 13。
除此之外,Oracle 的另一個宣告也十分值得我們關注。宣告透露出的訊息是,如果堅持使用 Java 11 並計劃在下一個 LTS 版本(即 Java 17)釋出時再進行升級,開發者可能會發現自己的專案程式碼無法通過編譯。所以請記住,Java 新的開發規則現在宣告可以在一個版本中棄用某個 API 方法,並在下一個版本中刪除它。
採用新版本 Java 的注意事項
在本節中,將概述在採用新版本 Java 之前必須考慮的一些注意事項/風險。
被新版本系列“繫結”
如果採用了 Java 12 並使用新的語言特性或新的 API,這意味著實際上你已將專案繫結到 Java 的新版本系列。接下來你必須採用 Java 13, 14, 15, 16 和 17,並且必須在下一個版本釋出後的一個月內採用每個新版本。
使用了新版本,每個版本的使用壽命為六個月,並且在釋出後僅七個月就過時了。這是因為每個版本只有在六個月內提供安全補丁,釋出後1個月的第一個補丁和釋出後4個月的第二個補丁。7個月後,下一組安全補丁會發布,但舊版本不能獲取更新。
因此,你要判斷自身的開發流程是否允許升級 Java 版本,時間視窗方面會不會太狹窄?
升級的“絆腳石”
實際使用中有很多阻止我們升級 Java 的因素,下面列出一些常見的:
開發資源不足:你的團隊可能會非常忙碌或規模太小,你能保證兩年後從 Java 15 升級到 16 的開發時間嗎?
構建工具和 IDE:你使用的 IDE 是否會在釋出當天支援每個新版本?Maven? Gradle 呢? 如果不是,你有後備計劃嗎?請記住,你只有1個月的時間來完成升級、測試並將其釋出到生產環境中。此外還包括 Checkstyle,JaCoCo,PMD,SpotBugs 等等其他工具。
依賴關係:你的依賴關係是否都準備好用於每個新版本?請記住,它不僅僅是直接依賴項,而是技術堆疊中的所有內容。位元組碼操作庫尤其受到影響,例如 ByteBuddy 和 ASM。
框架:這是另一種依賴,但是一個大而重要的依賴。在一個月的狹窄時間視窗內,Spring 會每六個月釋出一個新版本嗎? Jakarta EE(以前的 Java EE)會嗎?如果它們不這樣做會怎麼樣?
雲 / 託管 / 部署
你是否可以控制程式碼在生產環境中的執行位置和方式?例如,如果你在 AWS Lambda 中執行程式碼,則無法控制。AWS Lambda 沒有采用 Java 9或10,甚至沒有采用 Java 11。所以除非 AWS 提供公共保證以支援每個新的 Java 版本,否則根本無法採用 Java 12。
如何託管你的 CI 系統?Jenkins, Travis, Circle, Shippable, GitLab 會快速更新嗎?如果不是,你會怎麼做?
對未來的預測
如果已經閱讀了上面的列表,並且你的程式碼和流程可以應對。這十分好,但更重要的是要明白,你也在限制未來進行改變的能力。例如,你的程式碼可能今天不在 AWS Lambda 上執行,但未來三年呢?
為採用新版本進行規劃
如果正在考慮採用新版本的 Java,建議你準備一份現在所依賴的所有內容的清單,或者可能在未來3年內會依賴的。你需要保證該列表中的所有內容都能正常工作,並與新版本一起升級,或者如果該依賴項不再更新,請制定好計劃。作者提供了他的清單:
Amazon AWS
Eclipse
IntelliJ
Travis CI
Shippable CI
Maven
Maven plugins (compile, jar, source, javadoc, etc)
Checkstyle, 以及相關的 IDE 外掛和 maven 外掛
JaCoCo, 以及相關的 IDE 外掛和 maven 外掛
PMD 和相關的 maven 外掛
SpotBugs 和相關的 maven 外掛
OSGi bundle metadata tool
Bytecode 工具(Byte buddy / ASM etc)
超過 100 個 jar 包依賴項
說了這麼多,作者當然不是鼓勵大家不進行升級,新語言特性帶來的好處以及效能增強會讓開發者受益,但升級背後的風險也應該考慮進去。
其他第三方產商的宣告
Spring 框架已經在視訊中表達了對 Java 12 的策略。關鍵部分是:
“Java 8 和 11 作為 LTS 版本會持續獲得我們的正式支援,對於過渡版本,我們也會盡最大努力支援。如果你升級到 Java 11,我們非常願意和你合作,但它們不會獲得正式的生產環境支援。因為長期支援版本才是我們關注的重心,對於 Java 12 及更高版本我們會盡最大的努力。”
作為典型軟體供應商的一個例子,Liferay 宣告如下:
Liferay 已決定不會對 JDK 的每個主要版本進行認證。我們將選擇遵循 Oracle 的主導並僅認證標記為 LTS 的版本。—— Liferay 部落格
總結
相信肯定已經有開發團隊採用了新版本的 Java,但希望他們是經過思考判斷之後做出的決定。除了文章中提到的問題,還會有很多其他在升級前需要思考的因素,歡迎在評論中留下你的看法。
原文:https://blog.joda.org/2018/10/adopt-java-12-or-stick-on-11.html
作者:Stephen Colebourne,是一名 Java 開發者,同時也是一位知名的 Java 博主和會議演講者。
編譯:開源中國
微信改版了,
想快速看到CSDN的熱乎文章,
趕快把CSDN公眾號設為星標吧,
開啟公眾號,點選“設為星標”就可以啦!
“徵稿啦”
CSDN 公眾號秉持著「與千萬技術人共成長」理念,不僅以「極客頭條」、「暢言」欄目在第一時間以技術人的獨特視角描述技術人關心的行業焦點事件,更有「技術頭條」專欄,深度解讀行業內的熱門技術與場景應用,讓所有的開發者緊跟技術潮流,保持警醒的技術嗅覺,對行業趨勢、技術有更為全面的認知。
如果你有優質的文章,或是行業熱點事件、技術趨勢的真知灼見,或是深度的應用實踐、場景方案等的新見解,歡迎聯絡 CSDN 投稿,聯絡方式:微信(guorui_1118,請備註投稿+姓名+公司職位),郵箱(guorui@csdn.net)。
推薦閱讀:
相關文章
- 現在該用 Java12,還是堅持使用老版本?Java
- 堅持與確定性:毒藥還是良藥?
- 機器學習用java還是python?機器學習JavaPython
- 各位前輩,我該採用java嗎?Java
- Java和C有什麼區別,應該學習Java還是CJava
- java還是C?Java
- 人生苦短,我選Python,C++,還是Java?PythonC++Java
- 我應該使用 MongoDB 還是 PostgreSQL? - AmritMongoDBSQL
- 堅持:學習Java後臺的第一階段,我學習了那些知識Java
- 測試開發應該選擇 Java 還是 Go 呢?JavaGo
- js堅持不懈之11:focus()方法JS
- 《老兵VR》製作人鍵盤喵:堅持做VR遊戲,是瘋過,還是傻了?VR遊戲
- 我該如何深入學習java?Java
- 終於,我還是下決心學Java後臺了Java
- java工程師,你還記得我嗎?我是Servlet+jdbc+javaBJava工程師ServletJDBC
- 學Java還是前端更好?Java前端
- 在考慮繼續堅持現有崗位,還是考慮轉崗
- 我應該直接學Swift還是Objective-C?SwiftObject
- 糾結應該先學Python還是Java?看完就有數了PythonJava
- 想搞資料探勘分析,應該學習java還是python?JavaPython
- Gitlab堅持用雲的原因Gitlab
- java學習11.12Java
- 我是初學者,請老師指點我該怎麼學JAVA,謝謝啦Java
- 挑戰Java面試題複習第1天,堅持就是勝利Java面試題
- NoSQL再次敗北——我堅持使用SQL的原因SQL
- 關於我的“堅持不懈”和”幡然醒悟“
- 學Java好還是前端好?Java前端
- DDR3記憶體還能堅持幾年?記憶體
- Java 是傳值還是傳引用 (轉)Java
- 入門IT該學Java還是Python?帶你全面分析優劣勢JavaPython
- 超硬核的Java工程師分享,什麼是Java?為什麼我要做Java,我是如何學習Java的?Java工程師
- 程式設計應該用 Mac,還是 PC ?程式設計Mac
- 程式設計應該用 Mac 還是 PC ?程式設計Mac
- 我去,你竟然還不會用 Java final 關鍵字Java
- 挑戰中,Java面試題複習第4天,堅持就是勝利。Java面試題
- 替代品不少,大家堅持用Hadoop的原因是什麼?Hadoop
- 伺服器和伺服器之間通訊,我該用rmi還是socket?伺服器
- 我是一個java初學者,不知道該看什麼原始碼Java原始碼