【轉載】Java 14都快出來了,爲什麼還有那麼多人執着於Java 8?

作者:blindpirate
鏈接:https://www.zhihu.com/question/360985479/answer/956242314
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
 

啊哈哈哈哈,這題我會!2018年我有一大部分工作都在和Java 9 作鬥爭!Java 9是2017年9月發佈的,而我們一直到2018年9月——花了整整一年的時間——才切換到Java 9,又花了三個月的時間切換到Java 11。

反觀JetBrains,似乎花了兩年多才把runtime升級到11(假設他們是從Java 9一發布就升了),我們和JB的代碼規模差不多,都是百萬級別的,現在你應該對升級這事的週期有一個基本的認識了吧?

總結一下,就是Java 9各種奇怪的改變+業界長久積累的庫中的瞎JB用法導致了大部分項目被迫停在Java 8上。我強烈建議把題目改成「爲什麼還有那麼多人被迫使用Java 8」,因爲,這真的是客觀原因啊。

我舉幾個栗子讓你們看看遷Java 9/11這件事情有多蛋疼,算是給想遷移的你們提前打個預防針。

Java 9之前,Java的版本號用的是這個標準,也就是我們常見的1.8.0_213這種字符串。 Java 9之後,大家一拍大腿,反正已經做了這麼多改變,不差這一個!來人啊!給我把這個版本號字符串換掉!於是有了JEP223,一個山寨版的語義化版本號,從此以後,版本號大概長這個樣子:9.0.0.4。平心而論,這個變更是非常必要的,但是一衆依賴以前的版本號字符串的庫就都哭了……誰能想到你丫的連這種東西都變啊。

(據說當年還有人提議以後Java的版本號跟業界保持一致,用18.1/19.1之類的年份+次序命名 ,後來就沒聲音了,應該是被打死了。)

那些廣爲人知的大庫還好說,改的還算及時,一些小作坊生產的三無庫就慘了,一調用就給你丟個Illegal version number 9.0.0.4出來, 還找不到人修,來來來你說咋辦?


Java 8之前對反射沒有限制,只要setAccessible(true) ,你連JVM的底褲都可以掀掉。我們都知道,一旦給用戶自由,用戶就會瞎JB用。大家都知道JVM初始化的時候傳進來的環境變量是不可變的,存在ProcessEnvironment的一個不可變Map裏。但是沒關係,我有反射啊……

其他的栗子還包括,通過反射調用各種私有的API……在你升級之前,你永遠不知道有多少地方在用這種鬼鬼祟祟的操作……升級就好像你面前的一條康莊大道,你開開心心地踏上去準備走,咚!一個地雷炸了!piaji!你掉坑裏了!二十米的路你走了三個月!黑着臉從坑裏爬出來,瞅瞅前面……這特麼還有多少個地雷在等着我啊……在爆炸之前你永遠不知道到底有多少庫在用反射偷偷摸摸調私有API,我管它叫薛定諤的反射。

這都是業界的庫裏的騷操作(其實我們的代碼裏也有……捂臉),Java 9對反射添加了限制。JDK團隊最初計劃在Java 9中全面限制反射,但最後因爲影響太大沒能實行……


還有最常用的一個操作叫做defineClass,用來把魔改後的字節碼注入ClassLoader。ClassLoader的這個方法是protected的,沒關係,我們有反射啊……另外一些小夥伴直接用反射調用Unsafe.defineClass——看名字你就知道有多不安全,Java 11之後這個方法直接被幹掉了。

能用到這些方法的庫通常都是大廠生產的有售後的庫,所以通常都能得到很好的解決。但是緊接着問題就來了——你把一個庫從2011年的版本直接升到了2018年的版本,你心裏慌不慌?

更別提有些小作坊的庫偷偷摸摸地從褲襠裏掏出來一個Unsafe.defineClass跟你哭喪着臉說,哥,這個方法我找不到了,咋辦……


在升Java 9成功之後,懷抱着升級成功的竊喜,我們又趁熱打鐵想升Java 10。然後碰到了IDEA的一個bug:IDEA錯誤地理解了一個還未生效的草案JEP182,編譯器給出了不正確的結果,我花了一上午時間調試IDEA的源代碼才發現是IDEA的鍋。IDEA尚且如此,其他項目碰到兼容性問題,真的只是時間問題。


業界的很多工具不支持Java 9,最廣爲人知的應該是FindBugs了。還好,它還算後繼有人,SpotBugs挑起了它的大梁,那些小作坊庫可就慘了,過去的十年是Java生態系統迅猛發展的十年,你的項目只要沾到一點“在自己的代碼裏瞎JB使用Java 8/斷言自己使用的是Java 8”的庫,可能就要花上幾天時間去調試、去嘗試解決。


最後,最重要的一點是,我們的代碼是有嚴格的自動化測試覆蓋的,所以我們在升級之後能非常有底氣地說我們升級成功了!對於沒有測試覆蓋的祖傳代碼,你升級完事,跑一下,似乎沒問題,但是真的沒問題麼?去問老天爺吧……沒有完善的測試覆蓋的項目請勿輕易嘗試。

 

其實升級不是什麼非常困難的事情,主要是費時費力,收益可能卻沒有那麼明顯。對於一個成熟的公司來說,代碼只是輔助業務的手段,而非目的。如果沒有十分的利益保證,別說升級,連bug都是可以不修的。就醬。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章