JDK與JRE
以及
模塊化系統: Jigsaw->Modularity
,本篇咱們將深刻理解模塊化。
以下圖所示,Jdk8與Jdk9的目錄結構,這個在以前的jdk與jre的文章已經說起。 java
從上面兩張圖對比能夠發現: JDK8: 在Jdk8中有兩個重要的jar,即rt.jar與tools.jar: sql
在Jdk8中有jre,在jre/lib目錄中有一個rt.jar(大小約64M),即rutime,提供了運行環境所用到的一些類庫;在lib目錄有一個tools.jar(大小約17M),是java中最基本的包,裏面包含了從java中最重要的lang包到各類高級功能如可視化swing的包。shell
JDK9: JDK9中沒有jre,沒有rt.jar,沒有tools.jar,都是一個一個模塊 安全
總結:Java8實際上是一個單體模式,一個簡單的HelloWorld,都須要100多M的JRE環境,Java9引入模塊後,模塊之間依賴關係更加清晰,只需引用須要的模塊。微信
public再也不意味着Accessible: requires
:指明對其它模塊的依賴 exports
:控制着哪些包能夠被其它模塊訪問到。全部不被導出的包默認都被封裝在模塊裏面。 因此說先有模塊的可讀性,進一步纔是模塊內的可訪問性(public)。maven
模塊的間接(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;
}
複製代碼
模塊化的依賴關係,很容易讓人聯想到mven和gradle,這個在上篇中也說起,後來有讀者也提出module和maven是什麼關係?解答以下:測試
Maven 有兩個主要的特徵:依賴管理和構建管理。 依賴管理便可以決定庫中的版本並從倉庫中下載下來。 構建管理即管理開發過程當中的任務,包括初始化、編譯、測試、打包等。gradle
Module是系統內置用於表述組件之間的關係,對於版本的管理仍是處於最原始的狀體,管理一種強制的依賴關係。
總結一下:Maven仍是主要負責構建管理,Modules 對於像Maven這樣的構建工具(build tools)來講扮演的是輔助補充的角色。由於這些構建工具在構建時創建的依賴關係圖譜和他們版本能夠根據Module來建立,Module強制肯定了module和artifacts之間的依賴關係,而Maven對於依賴並不是是強制的。 具體可參考StackOverflow上的一篇問答:Project Jigsaw vs Maven on StackOverflow
./jlink --module-path ../jmods/ --add-modules java.sql --output /Users/shipeipei/Desktop/xxx
複製代碼
執行腳本後,在桌面生成了xxx文件夾,整個文件夾其實就是一個裁剪後的jdk,大小爲49.2M:
一、將系統內部類進行模塊化
二、將ClassLoader分級: 將ClassLoader分爲三個級別:
在這三個級別的Loader下面有一個統一Module管理,用於控制和管理模塊間的依賴關係,可讀性,可訪問性等。