Java9模块化系统
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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把模块打包成可以在任何小型甚至微型设备上运行的程序,这些都是模块化取得的巨大进步了。
以上是关于Java9模块化系统的主要内容,如果未能解决你的问题,请参考以下文章