【转载】Java 9 新特性——模块化
来自 <http://www.jianshu.com/p/053a5ca89bbb#>
前言
年,我们将迎来 Java 语言的 22 岁生日,22岁,对于一个人而言,正是开始大展鸿图的年纪,可是对于日新月异的科技圈中的一门开发语言而言,却是一个傲视群雄的老态龙钟的年纪。

JVM 语言发展史
年中茁壮发展,并且都秉承着 Java 的革命口号:一处编译,随处运行。
那么,JVM 的带头人 Java 在 9.0 的版本中带来了什么变化呢?
模块化
今天介绍一个Java 9的功能,模块化(Modular);这可能使Java有史以来最大的Feature,它将自己长期依赖JRE的结构,转变成以Module为基础的组件,这感觉就像一个壮士,需要把自己的胳膊,腿等,一个个拆下来,并且还能够正常运行工作,难度可想而知。虽然,Java 9尚未发布,但这个功能让人期盼和煎熬了好多年了。
年的第一天起,Java带着一个口号,"Write once , Run anywhere" ,一路走来,从学院派的实验语言,变成开发者最青睐的语言,然后成为企业开发的统一语言,二十弱冠。时光如斯,Java也从一个创新的语言,慢慢变成一种"传统","老旧","经典"语言,同时也接受很多新鲜语言的挑战,例如Go,Scalar等。
Java从来就不是一种完美的语言:GC的效率总是给高并发程序员带来不少痛苦和调整,Classpath地狱总是让很多错误诡异的发生,高级语言特性总是在JCP(Java Community Process)里面踢皮球而无法落地,异步模式的多线程编程总是有陡峭的学习曲线,Oracle JDK和OpenSDK总是有扯不清楚的关系,孤芳自傲且让人崩溃的J2EE框架。
年,更有两个原因:
- Java的生态:几乎所有开发库都支持Java语言,Java是打开程序世界的钥匙。
- Java语言的开源:Java源代码设计流畅,可以学到很多设计技能。
模块化从Java 7就开始计划推出,但由于其过于复杂,不断跳票 Java 7和Java 8,终于计划在Java 9中推出,我们一起拭目以待吧!目前,Java 9的功能基本开发完毕,剩下半年的时间,解决各种Bug。下面是Java 9的时间表!

Java 9的时间表
Java 9中最重要的功能,毫无疑问就是模块化(Module),代码名字叫做Jigsaw(拉锯),这个拉锯项目拉了几年,终于要把庞大冗余的Java锯成一个个的Module,方便开发和部署。熟悉Java的同学,都知道JRE有一个超级大rt.jar(例如,Java 8的rt.jar中有65M),运行一个hello world,你也需要一个数百兆的JRE环境,如果在J2EE环境,情况将变得复杂无比。另外,如果你没有深受Classpath Hell所害,说明你还不是一个深度Java程序员。

Java 9 模块化优势对比图
模块化的功能有几个目的:
- 让Java的SE程序更加容易轻量级部署
- 改进组件间的依赖管理,引入比Jar粒度更大的Module
- 改进性能和安全性
如果用更加简单解释,那就是"解决Classpath地狱问题,改进部署能力"。Module的内容比较多,为了由浅入深,我按照一些问题和我的理解来介绍模块化。
1.什么是Java Module(模块)
模块就是代码和数据的封装体,代码是指一些包括类型的Packages。Package是一些类路径名字的约定,而模块是一个或多个Packages组成的一个封装体。

什么是模块化
2. 模块的代码例子
模块的是通过module-info.java进行定义,编译后打包后,就成为一个模块的实体;在模块的定义文件中,我们需要指定模块之间的依赖靠关系,可以exports给那些模块用,需要使用那些模块(requires) 。下面是一个例子:
module com.foo.bar {
requires org.baz.qux;
exportscom.foo.bar.alpha;
exportscom.foo.bar.beta;
}
META-INF/
META-INF/MANIFEST.MF
module-info.class
com/foo/bar/alpha/AlphaFactory.class
com/foo/bar/alpha/Alpha.class
...
3.JDK8 和JDK9有什么不一样?
多兆),tools.jar也有几十兆,即使使用一个Hello Worlds,你也需要一整套上百兆的JRE环境。
JAVA 9 引入模块后,将所有的类组织成模块形式,模块之间有着优美的依赖关系(至少现在很整齐,不知道过几个版本会不会继续保持优雅)。

Java 8的包之间的依赖关系

Java9的依赖关系(模块之间依赖关系)
4. Public 不再意味着Accessible(可访问了)
模块之间的关系被称作readability(可读性),代表一个模块是否可以找到这个模块文件,并且读入系统中(注意:并非代表可以访问其中的类型)。在实际的代码,一个类型对于另外一个类型的调用,我们称之为可访问性(Accessible),这意味着可以使用这个类型;可访问性的前提是可读性,换句话说,现有模块可读,然后再进一步检测可访问性(安全)。
在Java 9中, Public不再意味着任意的可访问性!

Public不再意味着任意的可访问性

模块之间的关联关系
5.什么是模块的Transitive 引用(间接引用)
举个例子:

我是栗子
因此标记了transitive可以可以提供一个间接可读性。在myapp中,可以直接引用Logger类了。

可读性示意图
6. Module 和Maven是什么关系
看完Module,这么详细的表达依赖关系,是不是和什么软件很相似?是不是想起了Maven还是Gradle? 仔细想象,Modular和它们还是不一样的。
Modular是系统内置用于表述组件之间的关系,对于版本的管理还是处于最原始的状体。它管理一种强制的依赖关系。
Maven有两个核心功能 a) 组件的依赖管理,特别是版本的管理,这种依赖是逻辑上的,并非强制的 b)管理开发过程中的各种任务,初始化,测试等等。
7. JLink介绍
JLink是将Module进行打包的工具,帮助目标机器的部署。打包后的文件将非常精简。

jLink工作示意图

jLink工作指令示范
8 Module的原理和实现
在内部实现中,整个过程非常繁琐复杂,大概有几件事情;
a)将系统内部类进行模块化
这样不用在区分太多J2ME, J2SE,J2EE了,大家都是用模块作为沟通语言。这需要整理所有的类和它们调用关系,调用频次等,把系统类模块化,这可能最复杂的一部分,不过结果是完美的。
b) 将ClassLoader分级
将ClassLoader分为三个级别,Bootstrap Loader具有最高优先级和权限,主要是核心的系统类;Platform Loader用于扩展的一些系统类,例如SQL,XML等;Application Loader主要用于应用程序的Loader。在这三个级别的Loader下面有一个统一Module 管理,用于控制和管理模块间的依赖关系,可读性,可访问性等。注意,ClassLoader在Java 9中的类装载逻辑和之前一样,但是,通过模块管理系统,ClassLoader.FindClass的能力,将被限制在readable&accessible的条件下,而不是之前的简单的Public条件。

【转载】Java 9 新特性——模块化的更多相关文章
- IBM Java 7 新特性和在 WAS 8.5 中的配置【转载】
IBM Java 7新特性以及在WAS V8.5 中的安装与版本切换 简介: 本文介绍了 IBM Java 7 的基本新特性以及 IBM 特有的新特性,并详细的介绍和分析了 JVM 所采用的新的垃圾回 ...
- Java-Runoob-高级教程:Java 9 新特性
ylbtech-Java-Runoob-高级教程:Java 9 新特性 1.返回顶部 1. Java 9 新特性 Java 9 发布于 2017 年 9 月 22 日,带来了很多新特性,其中最主要的变 ...
- Java 8新特性探究(八)精简的JRE详解
http://www.importnew.com/14926.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 ...
- Java-Runoob-高级课程:Java 8 新特性
ylbtech-Java-Runoob-高级课程:Java 8 新特性 1.返回顶部 1. Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Or ...
- Java 8新特性之旅:使用Stream API处理集合
在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...
- [转帖]Java 8新特性探究(八)精简的JRE详解
Java 8新特性探究(八)精简的JRE详解 https://my.oschina.net/benhaile/blog/211804 精简版的api 撸了今年阿里.网易和美团的面试,我有一个重要发 ...
- [转帖]Java 8新特性探究 前言
Java 8新特性探究 前言 https://my.oschina.net/benhaile/blog/174136 讲下java的历史 感觉挺好的. 评论 17 jdk8java8javase新特性 ...
- IBM Developer:Java 9 新特性概述
Author: 成富 Date: Dec 28, 2017 Category: IBM-Developer (20) Tags: Java (27) 原文地址:https://www.ibm.com/ ...
- Java 8新特性-4 方法引用
对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法 ClassName :: staticMetho ...
随机推荐
- Python中ndarray数组切片问题a[-n -x:-y]
先看看如下代码: >>a=np.arange(10)>>a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>a[-7:] array( ...
- 看图说说JVM老年代垃圾收集器
注:G1垃圾收集器是目前最前沿的GC收集器,未来将取代CMS垃圾收集器,可以作为整个Heap的收集器使用,不限于老年代!!!
- 命令行传递参数并排序 AS实现加法
题目:从命令行输入参数并进行排序 1.实验准备 Integer提供了能在 int 类型和 String 类型之间互相转换的方法,还提供了处理 int 类型时非常有用的其他一些常量和方法. static ...
- 打造自己的Sublime使用环境
1.破解LICENSE(如果不是特穷还是买一个吧,不是特别贵,支持正版)----- BEGIN LICENSE -----Andrew WeberSingle User LicenseEA7E-855 ...
- 【原创】在Windows系统中使用VC9、VC11编译32位、64位PHP及其扩展
项目中需要使用runkit模块实现AOP,但是团队成员的开发环境都是Windows,而runkit模块官方没有提供Windows环境下的dll扩展,只能自己编译. 下面是编译过程的分类总结.(操作系统 ...
- solr-4.10.2版本使用tomcat7部署
当前版本仅限于solr-4.10.2版本.默认环境使用的是jdk1.7,tomcat7.环境自己配置.网上一堆堆的. 1.下载相应的文件(solr-4.10.2.zip). 官网地址:http://l ...
- mysql5.7 column cannot be null
背景 独立测试环境安装了数据库,但安装的版本是mysql 5.7的版本,而研发用的是mysql5.6的版本,在执行某个数据库操作的提示,提示column “xxxx”cannot be null 问题 ...
- Caffe任务池GPU模型图像识别
一开始我在网上找demo没有找到,在群里寻求帮助也没有得到结果,索性将网上的易语言模块反编译之后,提取出对应的dll以及代码,然后对照官方的c++代码,写出了下面的c#版本 /*** * @pName ...
- [Cocos2d-x for WP8学习笔记] 获取系统字体
在Cocos2d-x for WP8较新的版本中,获取字体这一块,在wp8下默认返回了null,只能内嵌字体文件解决. 其实可以通过下面的方法获取系统的字体文件 CCFreeTypeFont::loa ...
- IIS服务器添加网站
1.添加IIS服务:对“我的电脑”右键,管理,点击服务和应用程序,如果下面没有”Internet Information Services(IIS)管理器“,打开控制面板,点击程序,启用或者关闭Win ...