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.

深入模組化

608 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

深入模組化

  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

×