Java9新特性系列(模块化系统: Jigsaw-Modularity)
模塊化的前時代
Ant時代 相信大家對Ant都不陌生,Ant是任務型的,定義了一系列的任務dir/compile/jar等等,缺點是操作文件 Maven時代 Maven/Gradle相對于Ant,增加了groupId/artifactId,版本管理,依賴管理 OSGI時代 OSGI用的比較少,估計大家比較陌生,其實我們用的Eclipse及插件都是OSGI編譯的
那么問題來了:當代碼庫越來越大,怎么管理類庫交叉依賴,以及類重復的問題呢?
產生背景及意義
-
談到Java9大家往往第一個想到的就是Jigsaw項目。眾所周知,Java已經發展超過20年(95年最初發布),Java和相關生態在不斷豐富的同時也越來越暴露出一些問題:
- Java運行環境的膨脹和臃腫。每次JVM啟動的時候,至少會有30~60MB的內存加載,主要原因是JVM需要加載rt.jar,不管其中的類是否被classloader加載,第一步整個jar都會被JVM加載到內存當中去(而模塊化可以根據模塊的需要加載程序運行需要的class)
- 當代碼庫越來越大,創建復雜,盤根錯節的“意大利面條式代碼”的幾率呈指數級的增長。不同版本的類庫交叉依賴導致讓人頭疼的問題,這些都阻礙了Java開發和運行效率的提升
- 很難真正地對代碼進行封裝, 而系統并沒有對不同部分(也就是JAR文件)之間的依賴關系有個明確的概念。每一個公共類都可以被類路徑之下任何其它的公共類所訪問到,這樣就會導致無意中使用了并不想被公開訪問的API。
- 類路徑本身也存在問題: 你怎么知曉所有需要的JAR都已經有了, 或者是不是會有重復的項呢?
-
同時,由于兼容性等各方面的掣肘,對Java進行大刀闊斧的革新越來越困難,Jigsaw從Java7階段就開始籌備,Java8階段進行了大量工作,終于在Java9里落地,一種千呼萬喚始出來的意味。
-
Jigsaw項目(后期更名為Modularity)的工作量和難度大大超出了初始規劃。JSR376 Java平臺模塊化系統(JPMS,Java Platform Module System)作為Jigsaw項目的核心, 其主體部分被分解成6個JEP(JDK Enhancement Proposals)。
-
作為Java9平臺最大的一個特性,隨著Java平臺模塊化系統的落地,開發人員無需再為不斷膨脹的 Java平臺苦惱,例如,您可以使用jlink工具,根據需要定制運行時環境。這對于擁有大量鏡像的容器應用場景或復雜依賴關系的大型應用等,都具有非常重要的意義。
-
本質上講,模塊(module)的概念,其實就是package外再裹一層,也就是說,用模塊來管理各個package,通過聲明某個package暴露,不聲明默認就是隱藏。因此,模塊化使得代碼組織上更安全,因為它可以指定哪些部分可以暴露,哪些部分隱藏。
設計理念
模塊獨立,化繁為簡 模塊化(以 Java 平臺模塊系統的形式)將JDK分成一組模塊,可以在編譯時,運行時或者構建時進行組合。
實現目標
- 主要目的在于減少內存的開銷
- 只須必要模塊,而非全部jdk模塊,可簡化各種類庫和大型應用的 開發和維護
- 改進Java SE平臺,使其可以適應不同大小的計算設備
- 改進其安全性,可維護性,提高性能
使用舉例
模塊將由通常的類和新的模塊聲明文件(module-info.java)組成。 該文件是位于 java 代碼結構的頂層,該模塊描述符明確地定義了我們 的模塊需要什么依賴關系,以及哪些模塊被外部使用。在 exports 子 句中未提及的所有包默認情況下將封裝在模塊中,不能在外部使用。 工程目錄結構:
分兩個module:- main-module
- dog-module
dog-module中類如下:
package net.hellomypastor.java9.entity;public class Dog {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;} } 復制代碼在src目錄下新建module-info.java:
module dog_module {exports net.hellomypastor.java9.entity; } 復制代碼exports:控制著哪些包可以被其它模塊訪問到。所有不被導出的包 默認都被封裝在模塊里面
main-module中類如下:
package net.hellomypastor.java9;import net.hellomypastor.java9.entity.Dog;public class MyModule {public static void main(String[] args) {Dog dog = new Dog();dog.setName("dog2018");dog.setAge(1);System.out.println("happy new year 2018");System.out.println(dog.getName());System.out.println(dog.getAge());} } 復制代碼在src目錄下新建module-info.java:
module main_module {requires dog_module; } 復制代碼requires:指明對其它模塊的依賴
微信公眾號:碼上論劍 請關注我的個人技術微信公眾號,訂閱更多內容總結
以上是生活随笔為你收集整理的Java9新特性系列(模块化系统: Jigsaw-Modularity)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入源码 UITableView 复
- 下一篇: 关于Kafka 的 consumer 消