從Java 9開始,JDK又引入了模塊(Module)。
在Java 9之前,一個大型Java程序會生成自己的jar文件,同時引用依賴的第三方jar文件,而JVM自帶的Java標准庫,實際上也是以jar文件形式存放的,這個文件叫rt.jar
,一共有60多M。jar只是用於存放class的容器,它並不關心class之間的依賴。
從Java 9開始引入的模塊,主要是為了解決“依賴”這個問題。如果a.jar
必須依賴另一個b.jar
才能運行,那我們應該給a.jar
加點說明啥的,讓程序在編譯和運行的時候能自動定位到b.jar
,這種自帶“依賴關系”的class容器就是模塊。
為了表明Java模塊化的決心,從Java 9開始,原有的Java標准庫已經由一個單一巨大的rt.jar
分拆成了幾十個模塊,這些模塊以.jmod
擴展名標識,可以在$JAVA_HOME/jmods
目錄下找到它們:
- java.base.jmod
- java.compiler.jmod
- java.datatransfer.jmod
- java.desktop.jmod
- ..
這些.jmod
文件每一個都是一個模塊,模塊名就是文件名。例如:模塊java.base
對應的文件就是java.base.jmod
。模塊之間的依賴關系已經被寫入到模塊內的module-info.class
文件了。所有的模塊都直接或間接地依賴java.base
模塊,只有java.base
模塊不依賴任何模塊,它可以被看作是“根模塊”,好比所有的類都是從Object
直接或間接繼承而來。把一堆class封裝為jar僅僅是一個打包的過程,而把一堆class封裝為模塊則不但需要打包,還需要寫入依賴關系,並且還可以包含二進制代碼(通常是JNI擴展)。此外,模塊支持多版本,即在同一個模塊中可以為不同的JVM提供不同的版本。
Java 9引入的模塊目的是為了管理依賴;
使用模塊可以按需打包JRE;
使用模塊對類的訪問權限有了進一步限制。