狠狠撸

狠狠撸Share a Scribd company logo
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

More Related Content

What's hot (20)

Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Java SE 7 技術手冊投影片第 05 章  - 物件封裝Java SE 7 技術手冊投影片第 05 章  - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
?
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
?
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
?
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Java SE 7 技術手冊投影片第 09 章 - Collection與MapJava SE 7 技術手冊投影片第 09 章 - Collection與Map
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
?
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Java SE 8 技術手冊第 17 章 - 反射與類別載入器Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Justin Lin
?
闯补惫补平台概论
闯补惫补平台概论闯补惫补平台概论
闯补惫补平台概论
Justin Lin
?
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
?
自订泛型、列举与标註
自订泛型、列举与标註自订泛型、列举与标註
自订泛型、列举与标註
Justin Lin
?
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Justin Lin
?
CH1:闯补惫补平台概论
CH1:闯补惫补平台概论CH1:闯补惫补平台概论
CH1:闯补惫补平台概论
Justin Lin
?
Java SE 7 技術手冊投影片第 12 章 - 通用API
Java SE 7 技術手冊投影片第 12 章  - 通用APIJava SE 7 技術手冊投影片第 12 章  - 通用API
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
?
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
?
Java SE 7 技術手冊投影片第 16 章 - 自订泛型、列举与标註
Java SE 7 技術手冊投影片第 16 章 - 自订泛型、列举与标註Java SE 7 技術手冊投影片第 16 章 - 自订泛型、列举与标註
Java SE 7 技術手冊投影片第 16 章 - 自订泛型、列举与标註
Justin Lin
?
Java Tutorial:Learn Java in 06:00:00
Java Tutorial:Learn Java in 06:00:00Java Tutorial:Learn Java in 06:00:00
Java Tutorial:Learn Java in 06:00:00
Justin Lin
?
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
?
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
?
Java SE 8 技術手冊第 18 章 - 自订泛型、列举与标註
Java SE 8 技術手冊第 18 章 - 自订泛型、列举与标註Java SE 8 技術手冊第 18 章 - 自订泛型、列举与标註
Java SE 8 技術手冊第 18 章 - 自订泛型、列举与标註
Justin Lin
?
2. 從 REPL 到 IDE
2. 從 REPL 到 IDE2. 從 REPL 到 IDE
2. 從 REPL 到 IDE
Justin Lin
?
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
Justin Lin
?
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Java SE 7 技術手冊投影片第 07 章 - 介面與多型Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Justin Lin
?
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Java SE 7 技術手冊投影片第 05 章  - 物件封裝Java SE 7 技術手冊投影片第 05 章  - 物件封裝
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
Justin Lin
?
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDEJava SE 8 技術手冊第 2 章 - 從JDK到IDE
Java SE 8 技術手冊第 2 章 - 從JDK到IDE
Justin Lin
?
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
?
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Java SE 7 技術手冊投影片第 09 章 - Collection與MapJava SE 7 技術手冊投影片第 09 章 - Collection與Map
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
?
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Java SE 8 技術手冊第 17 章 - 反射與類別載入器Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Java SE 8 技術手冊第 17 章 - 反射與類別載入器
Justin Lin
?
闯补惫补平台概论
闯补惫补平台概论闯补惫补平台概论
闯补惫补平台概论
Justin Lin
?
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
?
自订泛型、列举与标註
自订泛型、列举与标註自订泛型、列举与标註
自订泛型、列举与标註
Justin Lin
?
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Servlet & JSP 教學手冊第二版 - 第 12 章:從模式到框架
Justin Lin
?
CH1:闯补惫补平台概论
CH1:闯补惫补平台概论CH1:闯补惫补平台概论
CH1:闯补惫补平台概论
Justin Lin
?
Java SE 7 技術手冊投影片第 12 章 - 通用API
Java SE 7 技術手冊投影片第 12 章  - 通用APIJava SE 7 技術手冊投影片第 12 章  - 通用API
Java SE 7 技術手冊投影片第 12 章 - 通用API
Justin Lin
?
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件Java SE 7 技術手冊投影片第 04 章 - 認識物件
Java SE 7 技術手冊投影片第 04 章 - 認識物件
Justin Lin
?
Java SE 7 技術手冊投影片第 16 章 - 自订泛型、列举与标註
Java SE 7 技術手冊投影片第 16 章 - 自订泛型、列举与标註Java SE 7 技術手冊投影片第 16 章 - 自订泛型、列举与标註
Java SE 7 技術手冊投影片第 16 章 - 自订泛型、列举与标註
Justin Lin
?
Java Tutorial:Learn Java in 06:00:00
Java Tutorial:Learn Java in 06:00:00Java Tutorial:Learn Java in 06:00:00
Java Tutorial:Learn Java in 06:00:00
Justin Lin
?
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
?
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
?
Java SE 8 技術手冊第 18 章 - 自订泛型、列举与标註
Java SE 8 技術手冊第 18 章 - 自订泛型、列举与标註Java SE 8 技術手冊第 18 章 - 自订泛型、列举与标註
Java SE 8 技術手冊第 18 章 - 自订泛型、列举与标註
Justin Lin
?
2. 從 REPL 到 IDE
2. 從 REPL 到 IDE2. 從 REPL 到 IDE
2. 從 REPL 到 IDE
Justin Lin
?
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Java SE 7 技術手冊投影片第 07 章 - 介面與多型Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Java SE 7 技術手冊投影片第 07 章 - 介面與多型
Justin Lin
?

More from Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Justin Lin
?
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin
?
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
Justin Lin
?
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
Justin Lin
?
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
Justin Lin
?
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin
?
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
Justin Lin
?
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
Justin Lin
?
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
?
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
Justin Lin
?
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
Justin Lin
?
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
Justin Lin
?
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
Justin Lin
?
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
Justin Lin
?
13.并行、平行与非同步
13.并行、平行与非同步13.并行、平行与非同步
13.并行、平行与非同步
Justin Lin
?
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
Justin Lin
?
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
Justin Lin
?
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
Justin Lin
?
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
Justin Lin
?
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
Justin Lin
?
Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Justin Lin
?
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin
?
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
Justin Lin
?
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
Justin Lin
?
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
Justin Lin
?
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin
?
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
Justin Lin
?
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
?
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
Justin Lin
?
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
Justin Lin
?
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
Justin Lin
?
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
Justin Lin
?
13.并行、平行与非同步
13.并行、平行与非同步13.并行、平行与非同步
13.并行、平行与非同步
Justin Lin
?
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
Justin Lin
?
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
Justin Lin
?
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
Justin Lin
?
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
Justin Lin
?

深入模组化