Java9新特性系列(深入理解模組化)

史培培發表於2018-02-10

Java9新特性系列(深入理解模組化)
前兩篇文章介紹了Java9新特性系列JDK與JRE以及模組化系統: Jigsaw->Modularity,本篇我們將深入理解模組化。

模組化如何體現?

如下圖所示,Jdk8與Jdk9的目錄結構,這個在之前的jdk與jre的文章已經提及。

Java9新特性系列(深入理解模組化)

Java9新特性系列(深入理解模組化)

從上面兩張圖對比可以發現: JDK8: 在Jdk8中有兩個重要的jar,即rt.jar與tools.jar:

Java9新特性系列(深入理解模組化)

Java9新特性系列(深入理解模組化)

在Jdk8中有jre,在jre/lib目錄中有一個rt.jar(大小約64M),即rutime,提供了執行環境所用到的一些類庫;在lib目錄有一個tools.jar(大小約17M),是java中最基本的包,裡面包含了從java中最重要的lang包到各種高階功能如視覺化swing的包。

JDK9: JDK9中沒有jre,沒有rt.jar,沒有tools.jar,都是一個一個模組

Java9新特性系列(深入理解模組化)

總結:Java8其實是一個單體模式,一個簡單的HelloWorld,都需要100多M的JRE環境,Java9引入模組後,模組之間依賴關係更加清晰,只需引用需要的模組。

模組化的安全?

  • public不再意味著Accessible: requires:指明對其它模組的依賴 exports:控制著哪些包可以被其它模組訪問到。所有不被匯出的包預設都被封裝在模組裡面。 所以說先有模組的可讀性,進一步才是模組內的可訪問性(public)。

  • 模組的間接(Transitive)引用: 比如A模組requires了java.logging模組,B模組requires了A: 如果沒有用transitive關鍵字,那麼B模組還需要引入java.logging模組:

module a_module {
    requires java.logging;
}
module b_module {
    requires java.logging;
    requires a_module;
}
複製程式碼

如果使用了transitive關鍵字,那麼B模組就不需要引入java.logging模組:

module a_module {
    requires java.logging;
}
module b_module {
    requires a_module;
}
複製程式碼

module與maven/gradle是什麼關係?

模組化的依賴關係,很容易讓人聯想到mven和gradle,這個在上篇中也提及,後來有讀者也提出module和maven是什麼關係?解答如下:

Maven 有兩個主要的特徵:依賴管理和構建管理。 依賴管理即可以決定庫中的版本並從倉庫中下載下來。 構建管理即管理開發過程中的任務,包括初始化、編譯、測試、打包等。

Module是系統內建用於表述元件之間的關係,對於版本的管理還是處於最原始的狀體,管理一種強制的依賴關係。

總結一下:Maven還是主要負責構建管理,Modules 對於像Maven這樣的構建工具(build tools)來說扮演的是輔助補充的角色。因為這些構建工具在構建時建立的依賴關係圖譜和他們版本可以根據Module來建立,Module強制確定了module和artifacts之間的依賴關係,而Maven對於依賴並非是強制的。 具體可參考StackOverflow上的一篇問答:Project Jigsaw vs Maven on StackOverflow

模組化之後如何打包?

  • Jlink: JLink是將Module打包的工具,打包後的檔案非常精簡。 使用如下:
./jlink --module-path ../jmods/ --add-modules java.sql --output /Users/shipeipei/Desktop/xxx
複製程式碼

Java9新特性系列(深入理解模組化)
執行指令碼後,在桌面生成了xxx資料夾,整個資料夾其實就是一個裁剪後的jdk,大小為49.2M:
Java9新特性系列(深入理解模組化)

模組化的原理?

1、將系統內部類進行模組化

2、將ClassLoader分級: 將ClassLoader分為三個級別:

  • Bootstrap Loader具有最高優先順序和許可權,主要是核心的系統類;
  • Platform Loader用於擴充套件的一些系統類,例如SQL,XML等;
  • Application Loader主要用於應用程式的Loader。

在這三個級別的Loader下面有一個統一Module管理,用於控制和管理模組間的依賴關係,可讀性,可訪問性等。

Java9新特性系列(深入理解模組化)

微信公眾號:碼上論劍
請關注我的個人技術微信公眾號,訂閱更多內容

相關文章