Java 9+模块化:模块化背后的理论和动机

首先:使用Java 9+中引入的模块化功能来编写更简洁,架构更好的代码,库和系统。

一、为什么我们需要Java模块系统

当前的Java系统中模块化可以为专业程序员解决的问题是什么?

Java SE 8和更早的系统在开发或交付基于Java的应用程序时出现以下问题:

1.具有大尺寸的大型整体源文件

JAR文件rt.jar和其他文件一样大,以至于很难在小型设备中使用它们。

2.大型JDK和冗余工具

JDK太大,因此很难缩小到小型设备。三种紧凑配置类型已经出台在Java SE 8来解决这个问题:compact1,compact2,和compact3。但是,它们不能解决此问题,因为它们是静态的且不可自定义。

JDK大小的另一个缺点是应用程序和设备无法支持更好的性能。另外,最终打包的应用程序太大,无法部署在基于容器的应用程序和云环境中。

3.缺乏强封装

当前的Java系统中没有真正强大的封装,因为public访问修饰符太开放了-每个人都可以访问它。因为public太开放了,对访问一些像内部关键的API没有限制sun.*,*.internal.*例如,因为用户可以访问内部的API了。这使安全性成为一个大问题。同样,要支持更少的组件之间的耦合也有些困难。

那么,问题就变成了Java 9如何解决这些问题?

二、Java9模块化是如何体现的

如下图所示,Jdk8与Jdk9的目录结构,您会注意到的第一件事是JDK 9中的文件夹结构有所更改。


从上面两张图对比可以发现: JDK8: 在Jdk8中有两个重要的jar,即rt.jar与tools.jar。

在Jdk8中有jre,在jre/lib目录中有一个rt.jar(大小约64M),即rutime,提供了运行环境所用到的一些类库;在lib目录有一个tools.jar(大小约17M),是java中最基本的包,里面包含了从java中最重要的lang包到各种高级功能如可视化swing的包。

JDK 9文件夹不包含JRE。在JDK 9中,JRE被放到一个单独的分发文件夹中,该文件夹是多余的,并且已经包含了相同的工具bin。这不必要地增加了JDK的大小。

其他文件和文件夹已被删除并变成了模块。JDK 9软件包含一个名为的新文件夹jmods。该文件夹包含一组Java 9编译模块定义。


三、总结

Java8其实是一个单体模式,一个简单的HelloWorld,都需要100多M的JRE环境,Java9引入模块后,模块之间依赖关系更加清晰,只需引用需要的模块。