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和JSR(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打包器將針對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]上找到。
參見
- Java包
- 類路徑
- Java類加載器
參考資料
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.