Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

深入模組化

0 views

Published on

認識模組的種類
處理模組依賴與封裝細節
使用模組API
建立JAR、JMOD與JIMAGE

Published in: Technology
  • Be the first to comment

深入模組化

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

×