Java9新特性系列(深刻理解模块化)

前两篇文章介绍了Java9新特性系列 JDK与JRE以及 模块化系统: Jigsaw->Modularity,本篇咱们将深刻理解模块化。

模块化如何体现?

以下图所示,Jdk8与Jdk9的目录结构,这个在以前的jdk与jre的文章已经说起。 java

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

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

JDK9: JDK9中没有jre,没有rt.jar,没有tools.jar,都是一个一个模块 安全

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

模块化的安全?

  • public再也不意味着Accessible: requires:指明对其它模块的依赖 exports:控制着哪些包能够被其它模块访问到。全部不被导出的包默认都被封装在模块里面。 因此说先有模块的可读性,进一步才是模块内的可访问性(public)。maven

  • 模块的间接(Transitive)引用: 好比A模块requires了java.logging模块,B模块requires了A: 若是没有用transitive关键字,那么B模块还须要引入java.logging模块:模块化

module a_module {
    requires java.logging;
}
module b_module {
    requires java.logging;
    requires a_module;
}
复制代码

若是使用了transitive关键字,那么B模块就不须要引入java.logging模块:工具

module a_module {
    requires java.logging;
}
module b_module {
    requires a_module;
}
复制代码

module与maven/gradle是什么关系?

模块化的依赖关系,很容易让人联想到mven和gradle,这个在上篇中也说起,后来有读者也提出module和maven是什么关系?解答以下:测试

Maven 有两个主要的特征:依赖管理和构建管理。 依赖管理便可以决定库中的版本并从仓库中下载下来。 构建管理即管理开发过程当中的任务,包括初始化、编译、测试、打包等。gradle

Module是系统内置用于表述组件之间的关系,对于版本的管理仍是处于最原始的状体,管理一种强制的依赖关系。

总结一下:Maven仍是主要负责构建管理,Modules 对于像Maven这样的构建工具(build tools)来讲扮演的是辅助补充的角色。由于这些构建工具在构建时创建的依赖关系图谱和他们版本能够根据Module来建立,Module强制肯定了module和artifacts之间的依赖关系,而Maven对于依赖并不是是强制的。 具体可参考StackOverflow上的一篇问答:Project Jigsaw vs Maven on StackOverflow

模块化以后如何打包?

  • Jlink: JLink是将Module打包的工具,打包后的文件很是精简。 使用以下:
./jlink --module-path ../jmods/ --add-modules java.sql --output /Users/shipeipei/Desktop/xxx
复制代码

执行脚本后,在桌面生成了xxx文件夹,整个文件夹其实就是一个裁剪后的jdk,大小为49.2M:

模块化的原理?

一、将系统内部类进行模块化

二、将ClassLoader分级: 将ClassLoader分为三个级别:

  • Bootstrap Loader具备最高优先级和权限,主要是核心的系统类;
  • Platform Loader用于扩展的一些系统类,例如SQL,XML等;
  • Application Loader主要用于应用程序的Loader。

在这三个级别的Loader下面有一个统一Module管理,用于控制和管理模块间的依赖关系,可读性,可访问性等。

微信公众号: 码上论剑
请关注个人我的技术微信公众号,订阅更多内容
相关文章
相关标签/搜索