Java9 新特性之模块化 - Requires / Module

今年,2017年,我们将迎来 Java 语言的 22 岁生日,22岁,对于一个人而言,正是开始大展鸿图的年纪,可是对于日新月异的科技圈中的一门开发语言而言,却是一个傲视群雄的老态龙钟的年纪。

Java9 新特性之模块化 - Requires / Module_第1张图片
JVM 语言发展史

JVM 家族也是在这22年中茁壮发展,并且都秉承着 Java 的革命口号:一处编译,随处运行。

那么,JVM 的带头人 Java 在 9.0 的版本中带来了什么变化呢?

模块化

今天介绍一个Java 9的功能,模块化(Modular);这可能使Java有史以来最大的Feature,它将自己长期依赖JRE的结构,转变成以Module为基础的组件,这感觉就像一个壮士,需要把自己的胳膊,腿等,一个个拆下来,并且还能够正常运行工作,难度可想而知。虽然,Java 9尚未发布,但这个功能让人期盼和煎熬了好多年了。

从1995年的第一天起,Java带着一个口号,"Write once , Run anywhere" ,一路走来,从学院派的实验语言,变成开发者最青睐的语言,然后成为企业开发的统一语言,二十弱冠。时光如斯,Java也从一个创新的语言,慢慢变成一种"传统","老旧","经典"语言,同时也接受很多新鲜语言的挑战,例如Go,Scalar等。

Java从来就不是一种完美的语言:GC的效率总是给高并发程序员带来不少痛苦和调整,Classpath地狱总是让很多错误诡异的发生,高级语言特性总是在JCP(Java Community Process)里面踢皮球而无法落地,异步模式的多线程编程总是有陡峭的学习曲线,Oracle JDK和OpenSDK总是有扯不清楚的关系,孤芳自傲且让人崩溃的J2EE框架。

但是,我还是最喜欢Java编程语言,不仅因为使用了20年,更有两个原因:

Java的生态:几乎所有开发库都支持Java语言,Java是打开程序世界的钥匙。
Java语言的开源:Java源代码设计流畅,可以学到很多设计技能。
模块化从Java 7就开始计划推出,但由于其过于复杂,不断跳票 Java 7和Java 8,终于计划在Java 9中推出,我们一起拭目以待吧!目前,Java 9的功能基本开发完毕,剩下半年的时间,解决各种Bug。下面是Java 9的时间表!

Java9 新特性之模块化 - Requires / Module_第2张图片
Java 9的时间表

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

Java9 新特性之模块化 - Requires / Module_第3张图片

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

Java9 新特性之模块化 - Requires / Module_第4张图片

2. 模块的代码栗子

IntelliJ IDEA 2017.1 支持Java9的模块化特性 (Project Jigsaw)。 在此版本,模块文件中还支持基于特定名称与关键字的自动补全功能 code completion, 并且你可以快速斧正你项目中的模块化代码。
So,那就让我们来一探究竟什么是模块化工程。首先,我们创建一个普通的模块工程 IntelliJ IDEA module 其中包含了改变世界的伟大的 “Hello World” 。

A simple application
A simple application

IntelliJ IDEA 会引导你在工程中为你的模块创建一个module-info.java

Create new module-info.java
Create new module-info.java

module-info.java 将为你提供一个基础的模块代码结构。

Default module-info.java
Default module-info.java

一切听指挥,党会指引你正确的道路!此时,当你在按照以往那样使用一个Java类时,你就会看到模块化带来的新姿势。

Error using Logger
Error using Logger

Here,IntelliJ IDEA可以帮助你找出问题所在,并提出修复建议。

Add requires to module-info.java
Add requires to module-info.java

如你所料,进行这个操作之后IntelliJ IDEA对module-info.java文件进行了正确的更改。

Requires added
Requires added

当然,你也可以尝试自己编辑module-info.java文件,IDEA 会给你完整的补全和提示信息。

Code completion in module-info.java
Code completion in module-info.java

快速修复不仅可用于标准Java模块,还可帮助您自己编写模块代码。如果您尝试访问另一个IntelliJ IDEA模块中的代码,从一个模块的内部来使用模块化特性 (module-info.java文件中会有提示), IntelliJ IDEA 将会提示你如果没有进行正确的更改,是不能运行的。

Using other modules
Using other modules

首先,有很多提示来帮助你完成更改,所以,一旦module-info.java文件所在的模块下有java文件,你可以快速补齐后面的包路径。

Code completion for exports
Code completion for exports

回到这个被导入模块的类中来,使用Alt 和 Enter 来获取fix建议。这里有两个步骤:firstly, 模块 one需要依赖模块two。secondly,一旦此操作完成,模块one的module-info.java文件就能关联模块two。

Quick fixes for using modules
Quick fixes for using modules

这里有两个模块,需要格外注意的是:firstly, the IntelliJ IDEA modules 你可能已经熟悉; and secondly, 新的 Java 9 (Jigsaw) 模块被指定使用module-info.java。 要使用Java模块化特性,每个Java 9模块都需要对应于IntelliJ IDEA模块。还要注意的是(IntelliJ IDEA 2017.1中的最后一个示例所示),需要声明IntelliJ IDEA模块依赖关系以及Java 9模块依赖关系。所以在最后一个例子中,模块one依赖模块two:

IntelliJ IDEA module dependencies
IntelliJ IDEA module dependencies

但是在module-info.java文件中也需要声明它是关联模块two的:

Module-info dependency
Module-info dependency

英文原文

你可能感兴趣的:(Java9 新特性之模块化 - Requires / Module)