概述
创建这个项目的主要目的如下:
1、使程序员更容易的创建和维护库以及大型的应用程序
2、总体上提高Java SE平台的安全性和可能维护性,特别是JDK
3、能够改善应用程序的性能
4、能够使Java SE Platform和JDK缩减使用规模,以便在小型计算设备和密集云计算中使用。
为了达成这些目标,在Java SE 9的平台上设计和实现了一个标准的模块系统,并将该系统应用于平台自身及参考实现(Java 9参考实现),也就是说从java9开始,JDK自身也是基于jigsaw进行模块化的设计有开发的。它是模块化JDK和其他大型代码库的强有力的工具,而且依然对所有程序员保持友好。
现在我们已经实现了这个项目想要实理的目标,接下来,根据实际使用中的反馈,进行额外工作以改进模块系统和模块化平台。
项目Jigsaw是一个综合的项目,其新功能主要针对两个方面:
- 在Java语言中引入模块系统
- 及其在JDK源码和Java运行时中的实现
通过本文,我们将向你介绍Jigsaw项目及它的特性,最后将其打包为一个简单的模块化的应用程序。
模块化
简而言之,模块化是一个设计原则,用来帮助我们实现:
- 组件间的松耦合
- 明确组件间的约定和依赖
- 使用强封装来隐藏实现
模块化的单位
现在问题来了,什么是模块化的单位呢?在Java的世界里,特别是OSGi,JAR被认为是模块化的单位。
JAR确实有助于将相关的组件彼此间组合在一起,但是它们存在一些缺点:
- JAR间显式的契约和依赖关系
- 在JAR内部元素的封装很弱
JAR的地狱
JAR存在其他的问题——JAR 地狱。在classpath中存在着多个版本的JAR,导致类加载器加载从JAR中找到的第一个类,结果会非常出乎意料。
另外的问题是JVM使用这样的classpath会成功的编译应用程序,但是应用程序会因为ClassNotFoundException而在运行时失败,原因是运行时的classpath上缺少jar。
Jigsaw的卖点
模块化的最大的卖点就是强封装性。
一个JAR文件中的任何公有(public)类在JVM中的任何地方都是可见的。这严重的限制了JDK实现的保持内部API的私有性的能力。在Java运行时中,有些类不需要也不想对外开放,而有些类又是必须对外公开的。
使用模块化使这一切带来了转变。每一个模块都能够显示的定义它的API是哪种可见类型。是对包(JAR文件包)内可见、还是对JVM可见。
它让非公有的类(default)与未进行包导出的类一样,都不能从模块的外部进行访问。
结束
由于来自于maven的中央仓库的很多类库还不支持模块化,找不到相关的模块描述文件,所以暂时不要使用它来构建自己的项目,否则会因为无法找到引入其它第三方类库的模块而无法编译。