Java中的模块(Module)入门介绍

发布时间 2024-01-08 11:04:45作者: DoubleLi

Java中的模块(Module)入门介绍

在Java 9版本中Java 语言引入了一个非常重要的概念:模块(module)。module引入了Java代码分组的另一个级别。每个module都包含许多子package(包)。模块是一组密切相关的包和资源以及一个新的模块描述符文件。

 

【Java和Python中的包和模块

Python模块(Modules),本质上是一个Python程序,以.py作为文件后缀。任何py文件都可以作为一个模块(Modules)。通过使用模块,不仅可以有效地避免命名空间的冲突,还可以将一个较大的程序分为多个文件,提升代码的可维护性和可重用性。

Python包(Package)的概念,特别在稍大型的项目中常常需要编写、用到大量的模块,此时可以使用包(Package)来管理这些模块,它实质上是一个目录(directory)。

Java文件是按照Java包的结构组织起来的,Java中的包通常包含相关的类,映射的实体概念是目录(directory),Java文件对应的目录结构层次要和包的结构层次一致。编译后的.class文件也需要按照包结构存放。Java 9 引入的模块(Module)是在Java包(package)的基础上又引入的一个新的抽象层。

关于Java中的包可参见 https://blog.csdn.net/cnds123/article/details/80446981

 

 Java中的package是Java中的基本组织单位, 每个包中包含Java类和接口文件。Java 9 引入的模块(Module)是在Java包(package)的基础上又引入的一个新的抽象层,是一组唯一命名(uniquely named)、可重用的相关包(packages)、资源(如图像和XML文件)和一个模块描述符(module descriptor)。模块类似于jar文件,因为两者都是一组包。两者之间的区别在于,模块包含元数据,即配置信息。模块的配置信息在一个名为 module-info.java 的特殊文件中指定。

模块描述符包含以下信息:

模块的名字——模块名称的声明

模块的依赖关系

它显式地向其他模块提供的包

它提供的服务

它所使用的服务

允许反射到的其他模块

 

模块名称的声明

一个模块的自描述表现在它的模块声明中,它是java程序语言中的一个新的结构,最简单的可能的模块声明仅仅是指定模块的名字,如:

module com.foo.bar { }

其中,com.foo.bar是模块名称。

 

使用模块化编程的一个java项目通常含三个子目录:lib,mods和src,其中src目录用于保存源代码; mods目录将已编译的代码保存在展开的目录层次结构中;在编译源代码之后,将其打包成一个模块化的JAR并将其存储在lib目录中。 可以使用模块化JAR来运行程序,也可以将模块JAR提供给可以运行程序的其他开发人员。

下面是含有两个模块“ common.widget”和“ data.widget”的项目示意,放置在文件夹“src”下。文件“ module-info.java”将放置在每个模块的根文件夹下。

其文件及目录格式示意如下:

模块命名规则类似于我们命名包的方式(允许点)。模块名外观和包名类似, 但和包不同,模块并不保存在对应的目录下,而是保存在与模块同名的目录下,比如common.widget模块保存在common.widget目录下,而不是common\widget目录下。模块名需要和所在的子目录同名的吗?建议相同(方便用javac编译多个模块,将有一些选项可一次编译多个模块的源代码)但非必须。上图示例中相同。

 

模块名和包名需要相同吗?否, 也可以选择所需的任何其他包名称。上图示例中就不相同,下面的例子模块名和包名称相同。


模块之间关系:可读性,使用Requires、Exports表示,更多情况可见https://www.cnblogs.com/zimug/p/13855837.html


下面给出一个使用模块的简单例子

改编自 https://www.runoob.com/java/java9-module-system.html

 

创建一个 com.test 的模块。

 

第一步

创建文件夹 D:\>JAVA\src,然后在该目录下再创建与模块名相同的文件夹 com.test。

 

第二步

在 D:\>JAVA\src\com.test 目录下创建 module-info.java 文件,代码如下:

module com.test { }

这一步我们创建了 com.test 模块。

 

第三步

在模块中添加源代码文件,在目录 D:\>JAVA\src\com.test\com\test 中创建文件 Java9Tester.java,代码如下:

package com.test;

 

public class Java9Tester {

   public static void main(String[] args) {

      System.out.println("Hello World!");

   }

}

 

第四步

创建文件夹 D:\>JAVA\mods,然后在该目录下创建 com.test 文件夹,编译模块到这个目录下。操作如下:

打开cmd,先使用cd /d D:\JAVA,切换到D:\JAVA目录,再输入如下命令编译模块

javac -d mods/com.test  src/com.test/module-info.java  src/com.test/com/test/Java9Tester.java

 

第五步

执行模块,输入如下命令查看输出结果:

java --module-path mods -m com.test/com.test.Java9Tester

其中,module-path 指定了模块所在的路径。

-m 指定主要模块。

输出:

Hello World!

 

第四步和第五步,可参见下图:

此示例比较简单,目的是让新手对如何使用模块有个感性认识。

 

 

进一步学习

https://www.jb51.net/article/242134.htm

Java基础-模块系统笔记(1) - SegmentFault 思否

Java 9 揭秘(2. 模块化系统) - 林本托 - 博客园

 

Java 9 揭秘(3. 创建你的第一个模块) - 林本托 - 博客园

Java9模块化遇坑-阿里云开发者社区