众所周知, 标准 jre 中 rt.jar 是一个重量级的文件, 其不仅仅包含了 java 应用运行所依赖的文件, 而且其自身也非常的庞大, 即便是我们仅仅编写一个入门级的 HelloWorld 程序, 依然要毫无保留的加载这个大块头. 以 jre7(后续版本 jrd 更大) 为例, 它就有 57.2M, 可以想象如此庞大的 jre 如何运行在小型或微型的设备上呢? 或者说让我们有选择的使用一个轻量化的 jre 而不是 jre 的全部, 那么要解决这个问题就要对 jre 中众多的类或包进行逻辑划分.
经历漫长的等待和煎熬 orcale 终于在 java se 9 中融入了的模块化系统, 这让全世界 java 程序员激动不已. 与包相比, 模块中可以包含一个或更多的包, 能够更好的对包进行组织与管理, 具有比包更强的封装性, 能够实现更细化的访问控制和更大粒度的代码重用, 真正实现功能模块化配置灵活的搭积木式的程序开发.
我们要用好这个模块化的 java se, 首先要熟悉下 java se 大概被分成了那些模块呢? 是这样的, Java9 标准模块以 java 作为前缀. 以下是部分标准模块名称:
如: java.base,java.naming,java.activation 和 java.logging 等. 而 java.base 是最基础最核心的模块, 其中封装了开发者最常用的包, 如: java.io,java.lang,java.math,java.net,java.text,java.util 等等.
Java9 非标准模块以 jdk 作为前缀. 以下是部分非标准模块名称:
jdk.accessibility,jdk.attach,jdk.charsets,jdk.compiler, jdk.httpserver 等等.
其他模块就不在这里赘述了. 下面基于命令行演示模块入门的声明与使用步骤:
1. 首先在某个盘下自定义一个目录 moduledemo;
2. 在这个名为 moduledemo 目录中创建一个名为 cn.itcast.modules.mymodule 的目录 (这个目录就是我们的模块信息存放目录了, 也是我们自定义模块的名称)
3. 在模块目录 cn.itcast.modules.mymodule 中创建一个名称必须为 module-info.java 的 java 文件
4. 打开 module-info.java 进行编辑, 加入如下内容:
module cn.itcast.modules.mymodule{ }
其中: module 是定义模块的关键字; cn.itcast.modules.mymodule 是自定义的模块名称, 该名称要和模块目录的名称 cn.itcast.modules.mymodule 一致
5. 在模块目录 cn.itcast.modules.mymodule 中创建名称为 cn 的文件夹, 在 cn 文件夹的内部创建 itcast 文件夹, 在 itcast 文件夹中创建 Hello.java 文件.
6. 编辑 Hello.java 文件, 加入如下内容:
- package cn.itcast;
- public class Hello{
- public static void main(String []args){
- System.out.println("Hello Module!!!");
- }
- }
最简单的模块就开发完毕, 下面进行编译和运行, 在命令行中进入 moduledemo 目录, 然后输入:
javac -d byteoutdir --module-source-path . cn.itcast.modules.mymodule/module-info.java cn.itcast.modules.mymodule/cn/itcast/Hello.java
其中:
-d: 指定字节码 class 的输出目录;
byteoutdir: 自定义的字节码文件的保存目录;
--module-source-path: 指定模块的源码路径;
当没有任何的错误提示说明编译通过了. 输入如下命令运行编译后的 Hello:
java --module-path byteoutdir -m cn.itcast.modules.mymodule/cn.itcast.Hello
运行后会在控制台输出: Hello Module!!!
上面演示了模块最基本的使用方法, 下面再演示一个使用 java.sql 模块的方法.
在现有模块目录 cn.itcast.modules.mymodule 中添加一个新的包, 包名 com 在该包下创建一个 JDBCDemo.java 的文件, 这样就在 cn.itcast.modules.mymodule 模块中有 cn.itcast 和 com 两个包
JDBCDemo.java 文件的内容如下:
- package com;
- import java.sql.Connection;
- public class JDBCDemo{
- public static void main(String []args){
- /* 使用 java.sql 包中的接口
- 需要在 module-info.java 文件中对 java.sql 模块进行声明 */
- Connection conn=null;
- }
- }
现在可以编译模块了, 输入:
javac -d byteoutdir --module-source-path . cn.itcast.modules.mymodule/module-info.java cn.itcast.modules.mymodule/cn/itcast/Hello.java cn.itcast.modules.mymodule/com/JDBCDemo.java
发现这次不能通过编译了, 错误信息如下:
程序包 java.sql 不可见
程序包 java.sql 已在模块 java.sql 中声明, 但模块 cn.itcast.modules.mymodule 未读取它
这是因为模块系统模块间彼此是隔离的, 模块中包的可见性受到了模块隔离性的限制, 尽管我们在 JDBCDemo.java 中导入了
import java.sql.Connection;
但是这个包是不可见的, 需要编辑模块信息文件 module-info.java, 最终的代码如下:
- module cn.itcast.modules.mymodule{
- requires java.sql; // 声明依赖的模块, 以便该模块中的类可以使用声明后的模块
- }
有了以上的 requires java.sql 声明部分我们在 JDBCDemo.java 中导入 import java.sql.Connection
就有效了.
下一步就可以把我们封装的模块打包为 jar 文件了 (限于篇幅不在赘述), 这个 jar 文件是可以被重用的, 最重要 的是这个 jar 文件还很小巧, 我们甚至可以借助于 jlink 把模块打包成可以在任何小型甚至微型设备上运行的程序, 这些都是模块化取得的巨大进步了.
来源: http://www.bubuko.com/infodetail-2563979.html