java9原定2017年3月推出寻拂,由于模塊化有問題延遲到7月份,后來又推遲到9月份丈牢。萬眾期待的java9由于模塊化的問題一再推遲祭钉,讓我們來看一下什么是java9的模塊化(代號Jigsaw
)。
環(huán)境準(zhǔn)備
jdk9搶先版下載己沛,最新版的Intellij(2017.2)已經(jīng)支持java9的模塊化慌核。
什么是模塊化
將一個(gè)或者多個(gè)java文件封裝起來,并且提供唯一的一個(gè)接口公布出去(module-info
)申尼。
一個(gè)模塊的格式如下:
由一個(gè)或多個(gè)package
和一個(gè)module-info
組成垮卓。這樣就創(chuàng)建了一個(gè)簡單的模塊,module-info
用是訪問該模塊的唯一入口晶姊。
module-info
每一個(gè)模塊都必須在根目錄下面有一個(gè)名為module-info
的java文件扒接。該模塊的信息將在module-info
中定義。
eq:
module model {
exports test;
}
我定義了一個(gè)名為model
的模塊,提供了包名為test
的包(外部可以通過module-info
引入該模塊钾怔,就可以訪問到test
包下的所有java文件)碱呼。
module-info
中的一些常用關(guān)鍵字:
-
module <moduleName>
模塊標(biāo)記,類似class
,interface
這些后跟模塊的名稱宗侦。 -
exports <package>
用來定義對外公布的package
愚臀,后面跟包名,可以提供多個(gè)矾利。 -
requires <moduleName>
用來定義當(dāng)前模塊需要依賴的模塊姑裂,后跟模塊名。 -
uses <className>
指定使用接口男旗。 -
opens <package>
指定包下的所有java文件對外開放可以通過反射調(diào)舶斧。 -
open
作用于module
上當(dāng)前模塊所有公布(exports
)出去的包下面的java文件都可以通過反射調(diào)用。 -
transitive
作用于requires
將當(dāng)前依賴的模塊傳遞性暴露出去察皇。
舉個(gè)栗子
//common模塊
module common {
//對外公開utils包下的所有java文件
exports utils;
}
//model模塊
module model {
//對外公開entity包下的所有java文件
exports entity;
//對外公開entity包下的所有java文件
exports vos;
//依賴common模塊茴厉,并且傳遞到外部。
requires transitive common;
}
//service模塊
module service {
//依賴model模塊什荣,由于model中已經(jīng)顯示的聲明將common傳遞出來矾缓。
//所以不需要再聲明依賴common就可以在service中調(diào)用utils包下的java文件。
requires model;
}
上面定義了三個(gè)模塊稻爬。依賴關(guān)系為common
為最底層模塊嗜闻,model
為中間層,service
為上層模塊桅锄。如果一個(gè)模塊比較復(fù)雜琉雳,根目錄下有多個(gè)子package,需要公開多個(gè)package下的java文件可以顯示的聲明多個(gè)exports
竞滓。exports
還可以顯示的指定發(fā)布到具體哪些模塊中咐吼,語法如下:exports <package> to <module>,<module>,...
小結(jié)
java9去除了傳統(tǒng)的jar引入方式,使用模塊化聲明式引入(我剛開始研究的時(shí)候商佑,用的老版本的Intellij然后引入jdk9之后找不到基礎(chǔ)jar包锯茄,編譯器報(bào)找不到class錯(cuò)誤,如果用命令行就不會(huì)出問題茶没,這也算是剛開始研究java9的一個(gè)小坑吧)肌幽。模塊化的特性:
-
聲明式依賴
通過聲明式的引入方式,降低了傳統(tǒng)jar包引入的耦合關(guān)系抓半,有點(diǎn)像maven的dependency(模塊化沒有版本的概念)喂急。 -
增強(qiáng)封裝
自定義封裝內(nèi)部實(shí)現(xiàn),只需要暴露外部訪問的接口類即可笛求。具體實(shí)現(xiàn)外面不需要知道也訪問不了(隱藏實(shí)現(xiàn))廊移。
這樣在運(yùn)行一些簡單的demo的時(shí)候就可以節(jié)省很多空間糕簿,不需要像以前一樣,把所有的jar都加載進(jìn)來狡孔。這樣顯示的聲明懂诗,需要什么引什么使java更輕量級,更方便開發(fā)苗膝。