1
深入模組化
學習目標
• 認識模組的種類
• 處理模組依賴與封裝細節
• 使用模組API
• 建立JAR、JMOD與JIMAGE
2
模組的種類
3
模組的種類
• Java SE 9也將JDK本身做了模組化,src.zip
中的原始碼被劃分到各個模組
• 除了可使用JAR來封裝模組之外,JDK9還有
了JIMAGE與JMOD格式
4
具名模組、未具名模組
• 如果應用程式採取模組化設計,預設就會依
賴在java.base模組之上,java.base模
組exports的套件,任何模組都可以讀取
5
具名模組、未具名模組
• 在JDK9之後多了模組,模組中的public類
別、方法、值域是否能被另一模組看見,還
要視模組設定而定
• 在定義模組時必須記得,同一個套件不可以
同時出現在被requires的兩個模組中,這
稱為分裂套件(Split package)
• 會導致編譯失敗,而執行時期會產生
LayerInstantiationException
6
具名模組、未具名模組
• 就算是Java SE API,若不是java.base模
組中的類別,還是必須requires相關的模
組
• 若使用到 javax.xml.bind、javax.rmi
等套件,還是會出現編譯錯誤
• 必須使用--add-modules java.se.ee,
才找得到這些套件。
7
顯式模組、自動模組
• 顯式模組無法依賴在未命名模組,因為未具
名模組並沒有名稱,無法在顯式模組的模組
描述檔中進行requires
8
顯式模組、自動模組
• 自動模組有隱含的模組定義,可以讀取其他
模組,其他模組也可以讀取自動模組
• 應用程式在遷移至模組化設計的過程中,自
動模組會是未具名模組至顯式模組之間的橋
樑
9
顯式模組、自動模組
• 並不是任何JAR都可以自動產生正確的模組
名稱
– 取得JAR的主檔名
– 去除版本號
– 替換名稱中非字母部份為句號(.)
10
顯式模組、自動模組
• 無法自動產生正確的模組名稱,此時若被放
到模組路徑的JAR檔案
– 編譯時期沒有名稱可以requires
– 執行時期會產生
IllegalArgumentException,從而使得
JVM無法初始模組層而發生FindException
11
顯式模組、自動模組
• 如果同一個套件出現在模組路徑上多個既有
的JAR檔案中,由於一個套件不能出現在多
個模組,因此只有其中一個JAR能成為自動
模組,而其他會被忽略
12
一般模組、開放模組
• 讀取能力
• 存取能力
13
一般模組、開放模組
• java.base模組exports了所有的套件,
但沒有opens套件,也沒有open模組本身,
• 任何模組都不能對java.base做深層反射
14
• 因應模組化的特性,類別載入器階層有了變
化
• 被棄用的模組可以使用@Deprecated標註
• 某個模組如果還是得使用被棄用的模組,又
不想收到警訊,那就加上個
@SuppressWarnings("deprecation")
15
requires、exports與opens
• requires transitive
• requires static
• exports to、opens to
16
requires transitive
17
requires static
• requires定義了模組間的依賴關係,而且
是包含了編譯時期與執行時期的依賴關係
• 如果某個模組是可選的,僅在編譯時期需要
,執行時期該模組可以不用存在,那麼可以
使用requires static來設定僅在編譯時
期依賴
18
exports to、opens to
19
修補模組
• 想臨時地替換掉模組中某(些)類別,像是
修補臭蟲,或進行測試時需要,也可能是臨
時性地修補分裂套件的問題
20
放寬模組封裝與依賴
• Oracle JDK非標準引數
– --add-exports
– --add-opens
– --add-reads
21
使用Module
22
使用Module
• 只有在模組內的類別,才能呼叫所在模組的
addExports​()、addOpens()、
addReads()、addUses​()
23
使用Module
24
使用ModuleDescriptor
• getDescriptor()可以傳回
java.lang.module.ModuleDescripto
r,這個實例代表著具名模組(包含自動模組
)的模組描述檔
• 未具名模組的getDescriptor()會傳回
null
• 包含的是靜態的模組描述資訊
25
淺談ModuleLayer
• 絕大多數的應用程式專案並不需要意識到模
組層的存在
• 像是某種服務容器或者plugins架構的應用程
式才會使用模組層
26
打包模組
• JAR
• JMOD
• JIMAGE
27

深入模組化