天天看點

java9新特性-4-子產品化系統: Jigsaw與Modularity1.官方Feature 2.産生背景及意義 3.設計理念 4.實作目标5.使用舉例 6. 補充說明

1.官方Feature

200: The Modular JDK

201: Modular Source Code

220: Modular Run-Time Images

260: Encapsulate Most Internal APIs

261:  Module System

282: jlink: The Java Linker

2.産生背景及意義

談到 Java 9 大家往往第一個想到的就是 Jigsaw 項目。衆所周知,Java 已經發展超過 20 年(95 年最初釋出),Java 和相關生态在不斷豐富的同時也越來越暴露出一些問題:

        ①Java 運作環境的膨脹和臃腫。每次JVM啟動的時候,至少會有30~60MB的記憶體加載,主要原因是JVM需要加載rt.jar,不管其中的類是否被classloader加載,第一步整個jar都會被JVM加載到記憶體當中去(而子產品化可以根據子產品的需要加載程式運作需要的class)

        ②當代碼庫越來越大,建立複雜,盤根錯節的“意大利面條式代碼”的幾率呈指數級的增長。不同版本的類庫交叉依賴導緻讓人頭疼的問題,這些都阻礙了 Java 開發和運作效率的提升。

        ③很難真正地對代碼進行封裝, 而系統并沒有對不同部分(也就是 JAR 檔案)之間的依賴關系有個明确的概念。每一個公共類都可以被類路徑之下任何其它的公共類所通路到,這樣就會導緻無意中使用了并不想被公開通路的 API。

        ④類路徑本身也存在問題: 你怎麼知曉所有需要的 JAR 都已經有了, 或者是不是會有重複的項呢?

同時,由于相容性等各方面的掣肘,對 Java 進行大刀闊斧的革新越來越困難,Jigsaw 從 Java 7 階段就開始籌備,Java 8 階段進行了大量工作,終于在 Java 9 裡落地,一種千呼萬喚始出來的意味。

Jigsaw項目(後期更名為Modularity)的工作量和難度大大超出了初始規劃。JSR 376 Java 平台子產品化系統(JPMS,Java Platform Module System)作為 Jigsaw 項目的核心, 其主體部分被分解成 6 個 JEP(JDK Enhancement Proposals)。

作為java 9 平台最大的一個特性,随着 Java 平台子產品化系統的落地,開發人員無需再為不斷膨脹的 Java 平台苦惱,例如,您可以使用 jlink 工具,根據需要定制運作時環境。這對于擁有大量鏡像的容器應用場景或複雜依賴關系的大型應用等,都具有非常重要的意義。

本質上講,子產品(module)的概念,其實就是package外再裹一層,也就是說,用子產品來管理各個package,通過聲明某個package暴露,不聲明預設就是隐藏。是以,子產品化使得代碼組織上更安全,因為它可以指定哪些部分可以暴露,哪些部分隐藏。

3.設計理念

子產品獨立、化繁為簡

子產品化(以 Java 平台子產品系統的形式)将 JDK 分成一組子產品,可以在編譯時,運作時或者建構時進行組合。

4.實作目标

主要目的在于減少記憶體的開銷

隻須必要子產品,而非全部jdk子產品,可簡化各種類庫和大型應用的開發和維護

改進 Java SE 平台,使其可以适應不同大小的計算裝置

改進其安全性,可維護性,提高性能

5.使用舉例

注:IntelliJ IDEA 2017.3支援子產品化特性,這裡選擇此開發環境。

子產品将由通常的類和新的子產品聲明檔案(module-info.java)組成。該檔案是位于java代碼結構的頂層,該子產品描述符明确地定義了我們的子產品需要什麼依賴關系,以及哪些子產品被外部使用。在exports子句中未提及的所有包預設情況下将封裝在子產品中,不能在外部使用。

java9新特性-4-子產品化系統: Jigsaw與Modularity1.官方Feature 2.産生背景及意義 3.設計理念 4.實作目标5.使用舉例 6. 補充說明

java 9demo 子產品中的ModuleTest類使用如下:

java9新特性-4-子產品化系統: Jigsaw與Modularity1.官方Feature 2.産生背景及意義 3.設計理念 4.實作目标5.使用舉例 6. 補充說明

對應在java 9demo 子產品的src

下建立module-info.java檔案:

java9新特性-4-子產品化系統: Jigsaw與Modularity1.官方Feature 2.産生背景及意義 3.設計理念 4.實作目标5.使用舉例 6. 補充說明
java9新特性-4-子產品化系統: Jigsaw與Modularity1.官方Feature 2.産生背景及意義 3.設計理念 4.實作目标5.使用舉例 6. 補充說明

requires:指明對其它子產品的依賴。

在java9test 子產品的指定包下提供類Person:

java9新特性-4-子產品化系統: Jigsaw與Modularity1.官方Feature 2.産生背景及意義 3.設計理念 4.實作目标5.使用舉例 6. 補充說明
java9新特性-4-子產品化系統: Jigsaw與Modularity1.官方Feature 2.産生背景及意義 3.設計理念 4.實作目标5.使用舉例 6. 補充說明

要想在java9demo子產品中調用java9test子產品下包中的結構,需要在java9test的module-info.java中聲明:

java9新特性-4-子產品化系統: Jigsaw與Modularity1.官方Feature 2.産生背景及意義 3.設計理念 4.實作目标5.使用舉例 6. 補充說明

exports:控制着哪些包可以被其它子產品通路到。所有不被導出的包預設都被封裝在子產品裡面。

6. 補充說明

關于更多Java 9 子產品程式設計的内容請參考一本書:《Java 9 Modularity》 裡面講的比較詳細,介紹了目前Java對jar之間以來的管理是多麼的混亂,引入modularity之後的改變會是很明顯的差别。