Java平台模塊系統

維基百科,自由的百科全書

Java平台模塊系統Java Platform Module System,簡稱JPMS[1]指定了Java代碼和相關資源的集合的分發格式。它還指定了一個用於存儲這些集合,或者說模塊的存儲庫,並確定如何發現、加載它們,以及檢查它們的完整性。它包含了命名空間等功能,旨在修復已有JAR格式中的一些缺點,尤其是JAR地獄,這可能導致類路徑和類加載等問題。

Java模塊系統最初是在JCP下開發的,稱為JSR 277,並計劃與Java 7一起發佈。

後來,JSR 277被擱置,並創建了Jigsaw項目[2]來將JDK模塊化。該JSR已被JSR 376(Java平台模塊系統)取代。

Jigsaw項目最初打算用於Java 7(2011年),但被推遲到Java 8(2014年),作為備用計劃的一部分,[3]後再次被推遲到2017年的Java 9版本。[4]包含了Java模塊系統的Java 9於2017年9月21日發佈。[5]

架構

Java 9中實現的Java模塊系統包括以下JEP英語JDK Enhancement ProposalJSR(Java規範請求)[2]

  • JEP 200:模塊化JDK:定義JDK的模塊化結構
  • JEP 201:模塊化原始碼:將JDK源碼按模塊化重新組織,增強構建系統來編譯模塊,並在構建時強制執行模塊邊界
  • JEP 220:模塊化運行時映像:重構JDK和JRE運行時映像,以適應模塊並提高性能、安全性和可維護性
  • JEP 261:模塊系統:實現Java平台模塊系統
  • JEP 282:Java連結器:創建工具以將一組模塊及其依賴項組裝和優化為自定義運行時映像[6]
  • JSR 376:Java平台模塊系統[1]

此外,JDK 9還添加了其它幾項功能,來輕鬆過渡到模塊系統:

  • JEP 238:多版本JAR文件:擴展JAR文件格式,以便多個特定於Java版本的類文件版本可以共存於單個存檔中。[7]
  • JEP 253:為模塊化準備JavaFX UI控件和CSS API:為JavaFX功能定義公共API,這些功能目前只能通過內部API獲得,並將因模塊化而變得無法訪問。[8]
  • JEP 260:封裝大多數內部API:使大多數JDK的內部API默認不可訪問,但保留一些關鍵的、廣泛使用的內部API可以訪問,直到其全部或大部分功能存在受支持的替代品為止。[9]
  • JEP 275:模塊化Java應用程式的打包:Java打包器英語Java packager將針對JDK 9進行改進,以使其能夠識別模塊,例如可以打包一個模塊及其依賴的所有模塊。[10]

模塊的屬性

模塊是一種新的代碼組織方式。與JAR文件相反,模塊顯式聲明它們依賴哪些模塊,以及導出哪些包。[11]顯式依賴關係聲明可以更輕鬆地推理大型應用程式與軟件組件之間的依賴關係,從而提高代碼完整性。

模塊聲明放在module-info.java文件中,該文件位於模塊源文件層次結構的根目錄。在編譯時和運行時,JDK都會驗證模塊之間的依賴關係以及交互。

例如,以下就是一個模塊聲明。它聲明模塊com.foo.bar依賴於另一個模塊com.foo.baz,並導出com.foo.bar.alpha和com.foo.bar.beta兩個包。

module com.foo.bar {
    requires com.foo.baz;
    exports com.foo.bar.alpha;
    exports com.foo.bar.beta;
}

com.foo.bar.alpha和com.foo.bar.beta兩個包中的公有成員將可由依賴模塊訪問。而私有成員則無法訪問,即使通過反射等手段也不行。請注意,在Java 9到Java 16中,是否允許這種「非法訪問」,事實上取決於命令行設置。[12]

JDK自身在Java 9中已經被模塊化。[13]

與OSGi的連結

Java模塊系統並不打算支持OSGi平台當前支持的所有功能(例如生命周期模型和服務註冊表)。但Java模塊系統也支持某些OSGi不支持的功能,例如編譯時的模塊化,以及內置支持native庫。[14]2016年有幾篇探討Java模塊系統和OSGi如何互操作的文章,可以在InfoQ[15],以及OSGi聯盟博客[16]上找到。

參見

參考資料

  1. ^ 1.0 1.1 Java Platform Module System (JSR 376) [Java平台模塊系統(JSR 376)]. 甲骨文公司. [2018-07-02] (英語). 
  2. ^ 2.0 2.1 Project Jigsaw [Jigsaw項目]. 甲骨文公司. [2015-11-29] (英語). 
  3. ^ Mark Reinhold. It's time for … Plan B [是時候……實施B計劃了]. 甲骨文公司. 2009-09-20 [2017-06-21] (英語). 
  4. ^ JDK 9. 甲骨文公司. [2016-02-24] (英語). 
  5. ^ Java 9: Release date and new features [Java 9:發佈日期和新功能]. techworld.com. 2017-07-21 [2017-11-18] (英語). 
  6. ^ jlink: The Java Linker (JSR 282) [jlink:Java連結器(JSR 282)]. 甲骨文公司. [2016-03-12] (英語). 
  7. ^ JEP 238: Multi-Release JAR Files [JEP 238:多版本JAR文件]. 甲骨文公司. [2017-07-31] (英語). 
  8. ^ JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization [JEP 253:為模塊化準備JavaFX UI控件和CSS API]. 甲骨文公司. [2017-07-31] (英語). 
  9. ^ JEP 260: Encapsulate Most Internal APIs [JEP 260:封裝大多數內部API]. 甲骨文公司. [2017-07-31] (英語). 
  10. ^ JEP 275: Modular Java Application Packaging [JEP 275:模塊化Java應用程式的打包]. 甲骨文公司. [2017-07-31] (英語). 
  11. ^ Mark Reinhold. The State of the Module System [模塊系統的狀態]. 甲骨文公司. 2016-03-08 [2017-02-18] (英語). 
  12. ^ JEP 396: Strongly Encapsulate JDK Internals by Default [JEP 396:JDK內部默認強封裝]. [2021-02-06] (英語). 
  13. ^ JDK Module Summary [JDK模塊總結]. 甲骨文公司. 2016-06-24 [2017-02-18]. (原始內容存檔於2015-12-08) (英語). 
  14. ^ Mark Reinhold. Project Jigsaw: Late for the train: The Q&A [Jigsaw項目:遲到的問答]. 甲骨文公司. 2012-08-24 [2015-11-29] (英語). 
  15. ^ Java 9, OSGi and the Future of Modularity [Java 9、OSGi與模塊化的未來]. InfoQ. [2016-09-26] (英語). 
  16. ^ Java Module Layers and OSGi Bundles [Java 模塊層與OSGi Bundles]. OSGi Alliance. [2016-08-01] (英語). 

外部連結