概述
JDK9发布以来,JAVA添加了一个重要的新功能,称为“模块”。模块提供了一种描述组成应用程序的代码的关系和以来层次的方式。模块还允许控制其中的哪些部分可以访问其他模块,哪些不能访问其它模块。使用模块可以创建更可靠、更具伸缩性的应用。
一般而言,模块对大型应用程序有很大的好处,因为模块可以降低与大型系统相关的管理复杂性。但是小规模的程序也能得益于模块,因为JDK的API现在组织到模块中。因此,如今的JAVA程序可以指定需要那部分的API,不需要哪部分的API。这项改变有助于计算机以更短的运行时间部署程序。
对模块的支持通过语言元素来提供,包括新关键字,以及对javac、java和其他JDK工具的改进,而且引入了新工具和文件格式。简单地说,模块是JAVA9的一个新特性。
模块基础
在最基本的意义上,模块可以通过模块名统一指代的包和资源的一种组合。模块声明指定了模块的名称,定义了模块及其包与其他模块的关系。模块声明是JAVA源文件中的语句。通过与之相关的几个关键字来支持:
exports、module、open、opens、provides、requires、to、transitive、uses、with
注意,这些关键字尽在模块声明的时候才会被看成关键字,在其他情况下,都会被解释为标识符。这样的设计,可以防止已有的旧代码把这些用于标识符时出现的兼容性问题。例如,假如在JDK9之前的某个程序中使用requires作为变量名。将改程序移植到JDK9之后,如果requires在模块外被识别为关键字,这段代码就会出现编译错误。尽在模块中将requires看做关键字可以有效的防止这一点,因此关键字requires也可以用作变量名,只是这种用法不推荐而已。
模块声明包含在module-info.java文件中。因此,模块在JAVA源文件中定义。这个文件由javac编译到一个类文件中,称为模块描述符。module-info.java文件只能包含一个模块定义,不是通用文件。模块声明以关键字module开头,一般形式如下:
module myModule {}
其中,myModule是模块名,必须是java有效的标识符。
牛刀小试
1)创建目录moduleapp,这是应用的顶级目录。
2)在moduleapp下创建目录appsrc,这是存放源代码的。
3)在appsrc下创建目录appstart。在这个子目录下在创建子目录appstart,在这个子目录下在创建appdemo,因此,从appsrc开始创建了如下结构:
appsrc\appstart\appstart\appdemo
4)在appsrc下创建appfuncs。在这个子目录下在创建appfuncs,在这个子目录下创建simplefuncs,因此,从appsrc开始创建了如下结构:
appsrc\appfuncs\appfuncs\simplefuncs
5)整个建好的目录结构如图:
6)在appfuncs\simplefuncs目录下,写一个SimpleMathFuncs.java:
7)在appstart\appdemo下写一个ModuleAppDemo.java,导入了SimpleMathFuncs类,使用了SimpleMathFuncs中的方法。
8)在appsrc\appfuncs下添加aapfuncs模块文件module-info.java:
9)在appsrc\appstart下添加模块文件module-info.java:
编译程序
JDK9开始支持模块,因此与其他JAVA程序一样,基于模块的程序也可以使用javac编译。不过我们需要给编译器指定模块路径,而且确保在moduleapp目录下执行javac命令。
1)使用如下命令编译SimpleMathFuncs.java文件:
javac -d appmodules/appfuncs appsrc/appfuncs/appfuncs/simplefuncs/SimpleMathFuncs.java
2)使用如下命令编译appfuncs模块:
javac -d appmodules/appfuncs appsrc/appfuncs/module-info.java
3)以上两步可以并为一步:
javac -d appmodules/appfuncs appsrc/appfuncs/module-info.java
appsrc/appfuncs/appfuncs/simplefuncs/SimpleMathFuncs.java
4)现在使用一个命令编译appstart模块和ModuleAppDemo.java文件
javac --module-path appmodules -d appmodules/appfuncs
appsrc/appstart/module-info.java
appsrc/appstart/appstart/appdemo/ModuleAppDemo.java
运行程序
使用如下命令运行该程序:
javac --module-path appmodules -m appsrc/appstart.appdemo.ModuleAppDemo
得到如下结果:
2是10的因数
35和105的最小公因数是:5
35和105的最大公因数是:7
如果大家有兴趣,我会继续更新模块的相关内容!