加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Java SE 9 模块化示例

发布时间:2023-04-18 14:22:17 所属栏目:教程 来源:
导读:Java SE 9引入了模块系统,模块就是代码和数据的封装体。模块的代码被组织成多个包,每个包中包含java类和接口;模块的数据则包括资源文件和其他静态信息。

在module-info.java文件中,我们可以用新的关键词modul
Java SE 9引入了模块系统,模块就是代码和数据的封装体。模块的代码被组织成多个包,每个包中包含java类和接口;模块的数据则包括资源文件和其他静态信息。

在module-info.java文件中,我们可以用新的关键词module来声明一个模块。

Java 9将JDK划分为多个模块以支持各种配置。参考JEP 200: The Modular JDK

可以使用如下命令查询所有的模块(注:JDK 版本大于等于9)

java --list-modules
模块描述符是在名为module-info.java的文件中定义的模块声明的编译版本。每个模块声明都以关键字module开头,后跟唯一的模块名称和括在大括号中的模块正文,格式如下

module modulename { 
}
模块声明的主体可以是空的,也可以包含各种模块指令(比如:exports, module, open, opens, provides, requires, uses, with等)。

下面介绍各种指令的含义

require 指令指定此模块依赖于另一个模块,这种关系称为模块依赖项。每个模块必须显式声明其依赖项。当模块A需要模块B时,模块A称为读取模块B,模块B由模块A读取。要指定对另一个模块的依赖关系,请使用 require,格式如下

requires modulename;
require static 指令,用于指示在编译时需要模块,但在运行时是可选的。这称为可选依赖项。

requires transitive 表示模块的隐含可读性,

如果这样写

module a {
    requires b;
}
表示

a模块强制要求存在b模块,这称为可靠配置。

a模块可以读入b模块的文件,这称为可读性。

a模块可以访问b模块的代码,这称为可访问性。

但是如果写成

module a {
    requires transitive b;
}
表示:

如果其他模块比如c依赖于a模块,a模块使用requires transitive引用b模块,那么c模块即便没有直接声明依赖于b模块,它对b模块也是具有可读性的,这个称之为隐含可读性。

即:a requires transitive b加上c requires a,则c对b也是可读。如果去掉transitive,则c对b不可读。

exports 指令指定模块的一个包,其public类型(及其嵌套的public类型和protected类型)应可供所有其他模块中的代码访问。

exports...to 指令使您能够在逗号分隔的列表中精确指定哪些模块或模块的代码可以访问导出的包,这称为限定导出。

uses 指令指定此模块使用的服务,使该模块成为服务使用者。服务是实现接口或扩展uses指令中指定的抽象类的类的对象。

provides...with 指令指定模块提供服务实现,使模块成为服务提供者。指令的 provide 部分指定列出的接口或抽象类,而 with 部分指令指定实现接口或扩展抽象类的服务提供程序类的名称。

open , opens, 和 opens...to 指令用于了解包中的所有类型以及某个类型的所有成员(甚至是其私有成员),无论您是否允许此功能。在 JDK 9 之前,这一功能是通过反射来实现的。

opens 指令

opens package
允许仅运行时访问包(package)。

opens...to 指令

opens package to comma-separated-list-of-modules
允许特定模块(module)仅运行时访问包(package)。

open 指令

open module modulename {
   // module directives

允许仅运行时访问模块中的所有包。

环境准备
本地的 JDK 版本应该大于等于 JDK 9。

使用示例
本文的示例均参考于:Project Jigsaw: Module System Quick-Start Guide

注:以下示例均在Windows下进行,在Mac或者Linux下把\\换成/。javac的版本一定要大于等于JDK 9。

示例1
新建一个example-01文件夹,作为项目根目录,在项目根目录下创建一个src文件夹,在这个文件夹下,创建一个文件夹作为module,文件夹名称为:com.greetings。在com.greetings文件夹下新建module-info.java文件夹,同时,在com.greetings文件夹中新建包,
即在com.greetings文件夹下新建com文件夹,在com文件夹下新建greetings文件夹。在greetings文件夹下新建Main.java。

目录结构如下

- example-01
    - src
        - com.greetings
            - module-info.java
            - com
                - greetings
                    - Main.java
module-info.java文件中内容如下

module com.greetings { 
}
Main.java中内容如下

package com.greetings;
public class Main {
    public static void main(String[] args) {
        System.out.println("Greetings!");
    }
}
在example-01目录下新建mods文件夹,用于存放编译后的目录,在mods文件夹中新建一个com.greetings的目录,

目录结构变成了如下

- example-01
    - mods
        - com.greetings
    - src
        - com.greetings
            - module-info.java
            - com
                - greetings
                    - Main.java

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章