CH19:深入模組化

Justin Lin
Justin LinTechnology / Community Evangelist at Free lancer
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
1 of 27

Recommended

深入模組化 by
深入模組化深入模組化
深入模組化Justin Lin
1K views27 slides
CH17:反射與類別載入器 by
CH17:反射與類別載入器CH17:反射與類別載入器
CH17:反射與類別載入器Justin Lin
280 views65 slides
CH02:從JDK到IDE by
CH02:從JDK到IDECH02:從JDK到IDE
CH02:從JDK到IDEJustin Lin
481 views58 slides
Java SE 8 技術手冊第 1 章 - Java平台概論 by
Java SE 8 技術手冊第 1 章 - Java平台概論Java SE 8 技術手冊第 1 章 - Java平台概論
Java SE 8 技術手冊第 1 章 - Java平台概論Justin Lin
11.6K views44 slides
Java SE 7 技術手冊投影片第 01 章 - Java平台概論 by
Java SE 7 技術手冊投影片第 01 章 - Java平台概論Java SE 7 技術手冊投影片第 01 章 - Java平台概論
Java SE 7 技術手冊投影片第 01 章 - Java平台概論Justin Lin
5.9K views43 slides
反射與類別載入器 by
反射與類別載入器反射與類別載入器
反射與類別載入器Justin Lin
562 views70 slides

More Related Content

What's hot

Java SE 7 技術手冊投影片第 14 章 - 整合資料庫 by
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Justin Lin
2.1K views100 slides
自訂泛型、列舉與標註 by
自訂泛型、列舉與標註自訂泛型、列舉與標註
自訂泛型、列舉與標註Justin Lin
633 views94 slides
Java SE 7 技術手冊投影片第 05 章 - 物件封裝 by
Java SE 7 技術手冊投影片第 05 章  - 物件封裝Java SE 7 技術手冊投影片第 05 章  - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝Justin Lin
2.6K views75 slides
CH16:整合資料庫 by
CH16:整合資料庫CH16:整合資料庫
CH16:整合資料庫Justin Lin
359 views107 slides
Java SE 8 技術手冊第 2 章 - 從JDK到IDE by
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJustin Lin
5.3K views66 slides
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器 by
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器Justin Lin
1.9K views48 slides

What's hot(20)

Java SE 7 技術手冊投影片第 14 章 - 整合資料庫 by Justin Lin
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin2.1K views
自訂泛型、列舉與標註 by Justin Lin
自訂泛型、列舉與標註自訂泛型、列舉與標註
自訂泛型、列舉與標註
Justin Lin633 views
Java SE 7 技術手冊投影片第 05 章 - 物件封裝 by Justin Lin
Java SE 7 技術手冊投影片第 05 章  - 物件封裝Java SE 7 技術手冊投影片第 05 章  - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin2.6K views
CH16:整合資料庫 by Justin Lin
CH16:整合資料庫CH16:整合資料庫
CH16:整合資料庫
Justin Lin359 views
Java SE 8 技術手冊第 2 章 - 從JDK到IDE by Justin Lin
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin5.3K views
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器 by Justin Lin
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin1.9K views
Java平台概論 by Justin Lin
Java平台概論Java平台概論
Java平台概論
Justin Lin2.4K views
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架 by Justin Lin
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Justin Lin2K views
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API by Justin Lin
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin3.1K views
Java SE 7 技術手冊投影片第 09 章 - Collection與Map by Justin Lin
Java SE 7 技術手冊投影片第 09 章 - Collection與MapJava SE 7 技術手冊投影片第 09 章 - Collection與Map
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin2.5K views
CH1:Java平台概論 by Justin Lin
CH1:Java平台概論CH1:Java平台概論
CH1:Java平台概論
Justin Lin1.3K views
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註 by Justin Lin
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Java SE 8 技術手冊第 18 章 - 自訂泛型、列舉與標註
Justin Lin2.8K views
2. 從 REPL 到 IDE by Justin Lin
2. 從 REPL 到 IDE2. 從 REPL 到 IDE
2. 從 REPL 到 IDE
Justin Lin234 views
認識物件 by Justin Lin
認識物件認識物件
認識物件
Justin Lin1.1K views
Java SE 7 技術手冊投影片第 12 章 - 通用API by Justin Lin
Java SE 7 技術手冊投影片第 12 章  - 通用APIJava SE 7 技術手冊投影片第 12 章  - 通用API
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin2.2K views
Java SE 7 技術手冊試讀 - Java 平台概論 by Justin Lin
Java SE 7 技術手冊試讀 - Java 平台概論Java SE 7 技術手冊試讀 - Java 平台概論
Java SE 7 技術手冊試讀 - Java 平台概論
Justin Lin5.5K views
進階主題 by Justin Lin
進階主題進階主題
進階主題
Justin Lin715 views
Java SE 8 技術手冊第 5 章 - 物件封裝 by Justin Lin
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin3.4K views
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註 by Justin Lin
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin2.2K views
Java SE 8 技術手冊第 17 章 - 反射與類別載入器 by Justin Lin
Java SE 8 技術手冊第 17 章 - 反射與類別載入器Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Justin Lin2.3K views

More from Justin Lin

Ch14 簡介 Spring Boot by
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
872 views22 slides
Ch13 整合 Spring MVC/Security by
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
280 views58 slides
Ch12 Spring 起步走 by
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
274 views31 slides
Ch11 簡介 JavaMail by
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin Lin
157 views8 slides
Ch10 Web 容器安全管理 by
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Justin Lin
153 views30 slides
Ch09 整合資料庫 by
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
233 views92 slides

More from Justin Lin(20)

Ch14 簡介 Spring Boot by Justin Lin
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Justin Lin872 views
Ch13 整合 Spring MVC/Security by Justin Lin
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin280 views
Ch12 Spring 起步走 by Justin Lin
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
Justin Lin274 views
Ch11 簡介 JavaMail by Justin Lin
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
Justin Lin157 views
Ch10 Web 容器安全管理 by Justin Lin
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
Justin Lin153 views
Ch09 整合資料庫 by Justin Lin
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin233 views
Ch08 自訂標籤 by Justin Lin
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
Justin Lin133 views
Ch07 使用 JSTL by Justin Lin
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
Justin Lin161 views
Ch06 使用 JSP by Justin Lin
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
Justin Lin250 views
Ch05 Servlet 進階 API、過濾器與傾聽器 by Justin Lin
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin204 views
Ch04 會話管理 by Justin Lin
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
Justin Lin238 views
Ch03 請求與回應 by Justin Lin
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
Justin Lin236 views
Ch02 撰寫與設定 Servlet by Justin Lin
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
Justin Lin352 views
CH1. 簡介 Web 應用程式 by Justin Lin
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
Justin Lin1.2K views
14. 進階主題 by Justin Lin
14. 進階主題14. 進階主題
14. 進階主題
Justin Lin406 views
13.並行、平行與非同步 by Justin Lin
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
Justin Lin237 views
12. 除錯、測試與效能 by Justin Lin
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
Justin Lin153 views
11. 常用內建模組 by Justin Lin
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
Justin Lin149 views
10. 資料永續與交換 by Justin Lin
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
Justin Lin156 views
9. 資料結構 by Justin Lin
9. 資料結構9. 資料結構
9. 資料結構
Justin Lin292 views

CH19:深入模組化