Java 9 新特性來臨——模塊化

前言

今年,2017年,我們將迎來 Java 語言的 22 歲生日,22歲,對(duì)于一個(gè)人而言,正是開始大展鴻圖的年紀(jì),可是對(duì)于日新月異的科技圈中的一門開發(fā)語言而言,卻是一個(gè)傲視群雄的老態(tài)龍鐘的年紀(jì)。

感謝 互聯(lián)居 的技術(shù)分享文章,有興趣的朋友可以去搜索微信公眾號(hào) 互聯(lián)居

JVM 語言發(fā)展史

JVM 家族也是在這22年中茁壯發(fā)展,并且都秉承著 Java 的革命口號(hào):一處編譯,隨處運(yùn)行。
那么,JVM 的帶頭人 Java 在 9.0 的版本中帶來了什么變化呢?

模塊化

今天介紹一個(gè)Java 9的功能,模塊化(Modular);這可能使Java有史以來最大的Feature,它將自己長期依賴JRE的結(jié)構(gòu),轉(zhuǎn)變成以Module為基礎(chǔ)的組件,這感覺就像一個(gè)壯士,需要把自己的胳膊,腿等,一個(gè)個(gè)拆下來,并且還能夠正常運(yùn)行工作,難度可想而知。雖然,Java 9尚未發(fā)布,但這個(gè)功能讓人期盼和煎熬了好多年了。
從1995年的第一天起,Java帶著一個(gè)口號(hào),“Write once , Run anywhere” ,一路走來,從學(xué)院派的實(shí)驗(yàn)語言,變成開發(fā)者最青睞的語言,然后成為企業(yè)開發(fā)的統(tǒng)一語言,二十弱冠。時(shí)光如斯,Java也從一個(gè)創(chuàng)新的語言,慢慢變成一種“傳統(tǒng)”,“老舊”,“經(jīng)典”語言,同時(shí)也接受很多新鮮語言的挑戰(zhàn),例如Go,Scalar等。
Java從來就不是一種完美的語言:GC的效率總是給高并發(fā)程序員帶來不少痛苦和調(diào)整,Classpath地獄總是讓很多錯(cuò)誤詭異的發(fā)生,高級(jí)語言特性總是在JCP(Java Community Process)里面踢皮球而無法落地,異步模式的多線程編程總是有陡峭的學(xué)習(xí)曲線,Oracle JDK和OpenSDK總是有扯不清楚的關(guān)系,孤芳自傲且讓人崩潰的J2EE框架。
但是,我還是最喜歡Java編程語言,不僅因?yàn)槭褂昧?0年,更有兩個(gè)原因:

  1. Java的生態(tài):幾乎所有開發(fā)庫都支持Java語言,Java是打開程序世界的鑰匙。
  2. Java語言的開源:Java源代碼設(shè)計(jì)流暢,可以學(xué)到很多設(shè)計(jì)技能。

模塊化從Java 7就開始計(jì)劃推出 ,但由于其過于復(fù)雜,不斷跳票 Java 7和Java 8,終于計(jì)劃在Java 9中推出,我們一起拭目以待吧! 目前,Java 9的功能基本開發(fā)完畢,剩下半年的時(shí)間,解決各種Bug。下面是Java 9的時(shí)間表!

Java 9的時(shí)間表

Java 9中最重要的功能,毫無疑問就是模塊化(Module),代碼名字叫做Jigsaw(拉鋸),這個(gè)拉鋸項(xiàng)目拉了幾年,終于要把龐大冗余的Java鋸成一個(gè)個(gè)的Module,方便開發(fā)和部署。熟悉Java的同學(xué),都知道JRE有一個(gè)超級(jí)大rt.jar(例如,Java 8的rt.jar中有65M),運(yùn)行一個(gè)hello world,你也需要一個(gè)數(shù)百兆的JRE環(huán)境,如果在J2EE環(huán)境,情況將變得復(fù)雜無比。另外,如果你沒有深受Classpath Hell所害,說明你還不是一個(gè)深度Java程序員。

Java 9 模塊化優(yōu)勢(shì)對(duì)比圖

模塊化的功能有幾個(gè)目的:

  1. 讓Java的SE程序更加容易輕量級(jí)部署
  2. 改進(jìn)組件間的依賴管理,引入比Jar粒度更大的Module
  3. 改進(jìn)性能和安全性

如果用更加簡單解釋,那就是“解決Classpath地獄問題,改進(jìn)部署能力”。Module的內(nèi)容比較多,為了由淺入深,我按照一些問題和我的理解來介紹模塊化。

1.什么是Java Module(模塊)

模塊就是代碼和數(shù)據(jù)的封裝體,代碼是指一些包括類型的Packages。Package是一些類路徑名字的約定,而模塊是一個(gè)或多個(gè)Packages組成的一個(gè)封裝體。

什么是模塊化
2. 模塊的代碼例子

模塊的是通過module-info.java進(jìn)行定義,編譯后打包后,就成為一個(gè)模塊的實(shí)體;在模塊的定義文件中,我們需要指定模塊之間的依賴靠關(guān)系,可以exports給那些模塊用,需要使用那些模塊(requires) 。下面是一個(gè)例子:

module com.foo.bar {
requires org.baz.qux;
exportscom.foo.bar.alpha;
exportscom.foo.bar.beta;
}
META-INF/
META-INF/MANIFEST.MF
module-info.class
com/foo/bar/alpha/AlphaFactory.class
com/foo/bar/alpha/Alpha.class
...
3.JDK8 和JDK9有什么不一樣?

JDK8的JRE的部署是一個(gè)單體模式,一個(gè)超大的rt.jar(大約60多兆),tools.jar也有幾十兆,即使使用一個(gè)Hello Worlds,你也需要一整套上百兆的JRE環(huán)境。
JAVA 9 引入模塊后,將所有的類組織成模塊形式,模塊之間有著優(yōu)美的依賴關(guān)系(至少現(xiàn)在很整齊,不知道過幾個(gè)版本會(huì)不會(huì)繼續(xù)保持優(yōu)雅)。

![3.JDK8 和JDK9有什么不一樣?
JDK8的JRE的部署是一個(gè)單體模式,一個(gè)超大的rt.jar(大約60多兆),tools.jar也有幾十兆,即使使用一個(gè)Hello Worlds,你也需要一整套上百兆的JRE環(huán)境。
JAVA 9 引入模塊后,將所有的類組織成模塊形式,模塊之間有著優(yōu)美的依賴關(guān)系(至少現(xiàn)在很整齊,不知道過幾個(gè)版本會(huì)不會(huì)繼續(xù)保持優(yōu)雅)。

Java 8的包之間的依賴關(guān)系
Java9的依賴關(guān)系(模塊之間依賴關(guān)系)
4. Public 不再意味著Accessible(可訪問了)

模塊之間的關(guān)系被稱作readability(可讀性),代表一個(gè)模塊是否可以找到這個(gè)模塊文件,并且讀入系統(tǒng)中(注意:并非代表可以訪問其中的類型)。在實(shí)際的代碼,一個(gè)類型對(duì)于另外一個(gè)類型的調(diào)用,我們稱之為可訪問性(Accessible),這意味著可以使用這個(gè)類型; 可訪問性的前提是可讀性,換句話說,現(xiàn)有模塊可讀,然后再進(jìn)一步檢測可訪問性(安全)。
在Java 9中, Public不再意味著任意的可訪問性!

Public不再意味著任意的可訪問性
模塊之間的關(guān)聯(lián)關(guān)系
5.什么是模塊的Transitive 引用(間接引用)

舉個(gè)例子:

我是栗子

因此標(biāo)記了transitive可以可以提供一個(gè)間接可讀性。在myapp中,可以直接引用Logger類了。

可讀性示意圖
6. Module 和Maven是什么關(guān)系

看完Module,這么詳細(xì)的表達(dá)依賴關(guān)系,是不是和什么軟件很相似?是不是想起了Maven還是Gradle? 仔細(xì)想象,Modular和它們還是不一樣的。

Modular是系統(tǒng)內(nèi)置用于表述組件之間的關(guān)系,對(duì)于版本的管理還是處于最原始的狀體。它管理一種強(qiáng)制的依賴關(guān)系。
Maven有兩個(gè)核心功能 a) 組件的依賴管理,特別是版本的管理,這種依賴是邏輯上的,并非強(qiáng)制的 b)管理開發(fā)過程中的各種任務(wù),初始化,測試等等。

7. JLink介紹

JLink是將Module進(jìn)行打包的工具,幫助目標(biāo)機(jī)器的部署。打包后的文件將非常精簡。

jLink工作示意圖
jLink工作指令示范
8 Module的原理和實(shí)現(xiàn)

在內(nèi)部實(shí)現(xiàn)中,整個(gè)過程非常繁瑣復(fù)雜,大概有幾件事情;

a)將系統(tǒng)內(nèi)部類進(jìn)行模塊化

這樣不用在區(qū)分太多J2ME, J2SE,J2EE了,大家都是用模塊作為溝通語言。這需要整理所有的類和它們調(diào)用關(guān)系,調(diào)用頻次等,把系統(tǒng)類模塊化,這可能最復(fù)雜的一部分,不過結(jié)果是完美的。

b) 將ClassLoader分級(jí)

將ClassLoader分為三個(gè)級(jí)別,Bootstrap Loader具有最高優(yōu)先級(jí)和權(quán)限,主要是核心的系統(tǒng)類;Platform Loader用于擴(kuò)展的一些系統(tǒng)類,例如SQL,XML等;Application Loader主要用于應(yīng)用程序的Loader。在這三個(gè)級(jí)別的Loader下面有一個(gè)統(tǒng)一Module 管理,用于控制和管理模塊間的依賴關(guān)系,可讀性,可訪問性等。 注意,ClassLoader在Java 9中的類裝載邏輯和之前一樣,但是,通過模塊管理系統(tǒng),ClassLoader.FindClass的能力,將被限制在readable&accessible的條件下,而不是之前的簡單的Public條件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • Oracle 在 9月22 日終于發(fā)布了 jdk 9 (難產(chǎn)了好長時(shí)間啊%>_<%),java在走過了22個(gè)年頭...
    樂浩beyond閱讀 7,042評(píng)論 2 5
  • 一 二 1.為什么要將對(duì)外開放確定為我國的基本國策? (1)對(duì)中國長期停滯落后的歷史教訓(xùn)深刻總結(jié)的結(jié)果。經(jīng)過30多...
    宇宙晨光閱讀 391評(píng)論 2 0
  • 唯有對(duì)自己卓越的才能和獨(dú)特的價(jià)值有堅(jiān)定、不可動(dòng)搖之確信的人才被稱為驕傲?!灞救A ? 剛才聽到了my sole ...
    棲惶閱讀 275評(píng)論 0 0
  • 文/魚筱豆 01 有些人看上去很聰明,其實(shí)卻傻的出奇;有些人看上去很傻,卻特別聰明伶俐。聰明的人總是覺得別人都比他...
    魚筱豆閱讀 462評(píng)論 2 2

友情鏈接更多精彩內(nèi)容