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