我们知道,在Java 9中,一个重要的改变就是模块化系统的引入,Java 9的模块化系统源于Jigsaw Project,我们首先看下Jigsaw Project的实现目标:

  • 模块化JDK:我们知道,现有JDK已经非常庞大,Jigsaw Project的目标就是将JDK分隔成一个个的小模块。
  • 模块化源码:当前源码jar文件也非常大,特别是rt.jarJigsaw Project也会考虑将源码切分成一个个的小模块。
  • 重构JDK和JRE运行时映像以适应模块化的目的
  • 封装绝大部分内部API,仅暴露几个重要的、使用频繁的内部API
  • 实现Java平台的模块化系统,允许用户通过构建自己的模块来开发应用程序,
  • jlink, the Java Linker:jlink工具的主要目标是" Allowing the user to create executable to their applications "

当前Java系统的主要问题

  • JDK太过于庞大以至于很难缩减应用到小的设备中去,Java 8 中通过引入三种类型的压缩配置文件来解决这个问题:compact1, compact2, compact3,但事实上却无法解决。
  • Jar文件比如rt.jar太大无法用于较小的设备和应用中去
  • 因为JDK太大,导致我们的应用或者设备无法提供更好的性能
  • 当前Java系统中没有实现很好的封装效果,每个人都可以访问public修饰符修饰的对象
  • 因为JDK和JRE太过庞大,对应用的测试和维护也相对较为困难
  • 因为public修饰符太过开放,因此一些内部API比如:sun.*, *.internal.*也不可避免的暴露出来。
  • 正因为用户可以访问内部接口,因此安全性也是一个不小的问题
  • 应用过于庞大
  • 很难支持组件之间的低耦合

Java 9 模块化系统的优势

  • 因为Java 9 将JDK、JRE、JAR文件切分成了一个个的小模块,因此,我们可以根据实际需要任意使用我们需要的模块,并且可以很方便的通过剔除不必要的模块,将应用部署到小的设备中去。
  • 易于测试和维护
  • 可以支持更好的性能表现
  • 兼具良好的开放与更好的封装特性
  • 用户将无法访问一些主要用于内部的API接口
  • 模块隐藏了内部细节,提供了很好的安全特性
  • 应用将更加小巧,因为我们只需要部署用到的模块
  • 支持组件间的低耦合
  • 支持单一责任原则(SRP, Single Responsibility Principle )

Java 8 vs Java 9

java 模块化插件化 java模块化系统_JDK 8

Java 8 的文件夹结构

java 模块化插件化 java模块化系统_java 模块化插件化_02

Java 9 的文件夹结构

java 模块化插件化 java模块化系统_Java_03

Java 9中不再包含rt.jar 和tool.jar,取而代之的是一个个模块.jmod

java 模块化插件化 java模块化系统_模块化_04

Java 9中的模块定义

模块就是包含代码、数据与资源的自描述集合。

java 模块化插件化 java模块化系统_JDK 9_05

Mother of Java 9 Module System

Oracle将JDK jars 和 Java SE 规范分成了两个模块集:

  • 所有的JDK模块均以jdk.*开头
  • 所有的Java SE规范模块均以“java.开头

注意,这里面有一个java.base模块,即我们所熟知的基础模块,它是一个完全独立的模块,并不依赖于其他任何模块。默认情况下,所有的模块均依赖于此模块,这也是java.base被称为The Mother of Java 9 Modules的原因,它是所有JDK模块和用户自定义模块的默认模块。

Java 8 和Java 9 应用程序对比

Java 8 应用程序通常如下:

java 模块化插件化 java模块化系统_模块化_06

Java 9 应用程序与前者相差不大,但引入了一个新的“模块”组件,以及一个模块描述符module-info.java

java 模块化插件化 java模块化系统_JDK 8_07

Java 8 的应用程序中,Packages是顶层组件,Java 9应用程序中Module是作为顶层组件。简单来讲,模块组成要素如下:

  • One Module
  • Module Name
  • Module Descriptor
  • Set of Packages
  • Set of Types and Resources

https://www.journaldev.com/13106/java-9-modules