珠峰前端架構(gòu)師培養(yǎng)計劃2021-太乙近天都,連山接海隅
JDK - JDK9模塊化系統(tǒng)的新特點
JAVA模塊化開發(fā)
珠峰前端架構(gòu)師培養(yǎng)計劃2021
download:https://www.51xuebc.com/thread-407-1-1.html
Java從來沒有停止過模塊化的嘗試,提出的superpackages,JAVA模塊系統(tǒng)直到Jigsaw這個原型項目的出現(xiàn),這個原本計劃和Java7一起交付的功能才延遲到Java9。作為一個原型項目,Jigsaw提供了JPMS(Java平臺模塊系統(tǒng))規(guī)范的參考實現(xiàn)。
另一個是獨立于Java社區(qū)的OGSI。到目前為止,OSGi已經(jīng)發(fā)展了20多年,OSGi是應(yīng)用程序模塊化事實上的標(biāo)準(zhǔn)。一方面,OGSI不是Java平臺的直接組件,所以不會影響平臺本身的模塊化開發(fā)。另一個重要因素是,OSGi使用類加載器實現(xiàn)的模塊化隔離,這與Jigsaw基于可訪問性規(guī)則實現(xiàn)的隔離機制完全不同。
話說回來,為什么模塊化如此重要?
首先,JAVA本身就是不斷臃腫的。從JAVA 1.1的不足10M到JAVA 8的200M+,安裝空間和內(nèi)存需求都相應(yīng)增加。雖然這種增加是新功能迭代帶來的,但是這些新功能大部分是大眾化的;但換個角度來說,每一個新功能都會對不需要的用戶造成膨脹??梢钥隙ǖ氖牵瑳]有一個工程師或者團隊會使用Java提供的所有能力(比如你做web項目的時候,你得帶上swing)。
另一方面,也是OSGI能夠發(fā)展的原因。它依靠類加載器實現(xiàn)業(yè)務(wù)級的隔離,并且具有動態(tài)加載的能力,這也使得插件機制或者熱加載機制有了非常大的發(fā)揮空間。
Java 9中的模塊系統(tǒng)
模塊化的前提是模塊劃分,JDK本身也被模塊化了。詳情見openjdk.org/jeps/200。
Java的模塊體系到底是什么?官方說法是,模塊化給包增加了更高層次的聚合,包括一組密切相關(guān)的包和資源以及一個新的模塊描述符文件。簡單來說就是一個Java包的包抽象。
目前,模塊系統(tǒng)有四種類型的模塊,如下表所示。
類型描述備注系統(tǒng)模塊Java SE和JDK模塊,通過list-modules可以看到完整的列表/應(yīng)用模塊業(yè)務(wù)自定義模塊/自動模塊。將非模塊jar添加到模塊路徑時,將創(chuàng)建一個名為jar的模塊。1.默認(rèn)情況下,將導(dǎo)出所有包。2.默認(rèn)情況下,可以訪問所有其他模塊的類將不會被命名。當(dāng)jar或類被添加到類路徑中時,所有這些類都將被添加到未命名的模塊中。1.只有其他未命名的模塊和自動模塊將被導(dǎo)出。這意味著應(yīng)用程序模塊不能訪問這些類。2.它可以訪問所有模塊的類。
我們通過一個小案例,也就是上表中的應(yīng)用模塊,直觀地體驗一下模塊化。
模塊外殼
這個案例包含兩個模塊,glmapper.modules模塊用于導(dǎo)出您自己的服務(wù),test.modules模塊用于測試和引用第一個模塊。
運行模塊
構(gòu)建模塊()
// modules是生成產(chǎn)品的輸出目錄。
#需要指定模塊路徑和主類來運行模塊。
> java -模塊-路徑模塊-m test.modules/com.glmapper.bridge.main.TestMain
>您好,Glmapper模塊!
復(fù)制代碼
如你所見,我們得到了正確的結(jié)果。
然后讓我們測試另一個場景,即在沒有在glmapper.modules中導(dǎo)出包的情況下重新構(gòu)建包時獲得的結(jié)果
1個錯誤
復(fù)制代碼
可以看到,在編譯test.modules時,它會檢測它所依賴的模塊中的包是否已經(jīng)導(dǎo)出,如果沒有導(dǎo)出,就無法編譯。
使用界面
在上面的案例中,為了方便測試,模塊中提供了一個可訪問的靜態(tài)方法;讓我們繼續(xù)轉(zhuǎn)換,在glmapper.modules中提供接口及其實現(xiàn),并使用提供的指令...用和來實現(xiàn)與測試模塊的交叉引用
在glmapper.modules中提供一個HelloService接口
摘要
本文介紹了Java模塊化。通過本文,你可以大致了解Java模塊化開發(fā)的基本情況,以及Java 9提供的模塊化和OSGI模塊化的區(qū)別。然后我通過一個案例向你介紹了Java模塊化的基本用法,希望對你有所幫助。