【传智播客郑州校区分享】Java9模块化系统

众所周知,标准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把模块打包成可以在任何小型甚至微型设备上运行的程序,这些都是模块化取得的巨大进步了。

猜你喜欢

转载自blog.csdn.net/qq_40208605/article/details/80333088
今日推荐