近日,Java平臺集團首席架構師Mark Reinhold參加今年的Devoxx大會。在大會上,Mark Reinhold發表了他對Jigsaw和Java 9的看法,指出了人們以往對Java 9新版本認知的十大誤解。
誤解一:Maven不適用于Java 9
Apache Maven的主席Robert Scholte宣布所有Maven版本3.0及以上版本都能夠在Java 9上運行。某些插件可能仍存在一些問題,但在大多數情況下都可以正常運行。
誤解二:程序員依賴的工具、庫以及框架都不能在Java 9上運行
有許多工具和框架都可以在Java 9上使用,如:
· Maven 3.0.0
· TestNG 6.11
· Log4J 2.8.2
· Clojure 1.8.0 *
· JUnit 4.12 & 5.0.0-M4
· IntelliJ 2017.2
· Spring Boot 1.5.3 & Spring Framework 4.3.8等
Oracle的開發團隊向程序員推薦了以上的工具和框架,這些可以確保Java 9的兼容性和訪問權限。
誤解三:要想使用Java 9就必須模塊化
這種想法是錯誤的。如果要在Java 9中導入一個在Java 8中構建的系統,其實是可以運行的,而且在類路徑上運行的問題很少。但現在必須面對的問題是內部API依賴的處理,實施強封裝是Jigsaw主要功能之一,但是這樣以來我們就無法訪問所有非關鍵的內部API。以下是在JDK增強提案(JEP 260)中所述的JDK特定模塊中,仍可以訪問的部分關鍵API:
· sun.misc.{Signal,SignalHandler}
· sun.misc.Unsafe (這個類中的許多方法可以通過variablehandles (JEP 193)實現)
· sun.reflect.Reflection::getCallerClass(int) (此方法的功能可以通過JEP 259以標準形式提供)
· sun.reflect.ReflectionFactory.newConstructorForSerialization
為了讓強封裝不破壞Java 9的向后兼容性,幫助系統更輕松的遷移到模塊化Java平臺,Mark Reinhold提出允許非法反射訪問的類路徑代碼默認在JDK 9中,并在未來的版本中禁用。由于Mark Reinhold的提議,我們現在可以通過編譯和運行時的命令行標志訪問非關鍵API。
但是,如果你想自己處理這些依賴性API,最好的選擇就是將這些API替換成維護的API。
誤解四:類似于OSGi的模塊在Java 9根本不能運行
這個理解是錯誤的。只要不使用內部API,OSGi這一類的模塊仍然會按照預期方式使用類路徑,Java 9并沒有阻止使用第三方模塊系統。
誤解五:Java 9中類路徑的代碼不能使用某些模塊導致Java社區分解
這種想法過于偏激了。類路徑上的代碼可以讀取所有公共以及受保護類型的解析模塊,這允許較大系統逐漸遷移。此外,一個可以被a.JAR文件運輸的庫或者框架可以被轉化成一個模塊。
誤解六:強封裝是Java 9被接受的唯一障礙
強封裝絕對不是Java 9使用的唯一障礙,人們依賴的內部API現在已經被隱藏了,但是這個版本中還有很多不兼容的東西。Rt.jar已經被一種新的更可靠的格式取代,系統圖像的布局也不同,一系列系統類有待提高安全性,這就意味著它們由類加載器加載,但是與引導類加載不同,版本字符串格式被改變了。
誤解七:sun.misc.Unsafe不會在Java 9中,所有的東西都會被中斷
這個擔心可能是多余的。sun.misc.Unsafe的API和其他常用內部API一樣仍可在Java 9中進行訪問。
前面說到,Jigsaw的強封裝會讓我們以前依賴的許多的內部API無法訪問。雖然強封裝不是唯一的障礙,但也會造成一定的問題。為了解決這個問題,Reinhold提出處理這些API的步驟:
1、 如果在JDK 8中有支持替換——>API封裝到JDK 9中。
2、 如果在JDK 8中無支持替換——>API不封裝到JDK 9,仍可被外部代碼訪問。
3、 如果在JDK 9中有支持替換——>拋棄,然后API封裝到JDK 9中,而且很有可能在JDK 10中刪除。
這個計劃針對的是允許非法訪問最常用的內部API,直到新的更換標準API引入平臺。
誤解八:Jigsaw將修復多版本問題
這個計劃好像還沒有開始實行,雖然Java社區的一部分人都希望Java 9能夠以允許方便快捷的加載給定名稱的多個不同模塊。相反,來自甲骨文的Alan Bateman建議應該從構建工具和容器入手,來解決同一模塊的多版本問題。
誤解九:Jigsaw無法修復多版本問題,壓根不能用
關于多版本的解決有兩個主要的含義:
1、 用類加載器以任何方式工作的API將以不兼容的方式發生變化。任何對類加載器關系做出假設的代碼都不會像以前那樣工作。
2、 構建工具需要重新優化支持多版本
Jigsaw團隊正在努力的解決這些問題。
誤解十:現有系統模塊化很容易
JDK模塊化花了9年的時間,任何大型系統都需要話費大量時間和資源才能從上一個版本轉化到下一個版本,而且最終獲得的成品可能還會不盡人意。在模塊化現有系統之前,權衡成本和收益是必須要考慮的問題。如果你正在構建一個新的項目,那一定要使用模塊化。