📜  Java 9-模块系统(1)

📅  最后修改于: 2023-12-03 15:31:28.364000             🧑  作者: Mango

Java 9-模块系统

简介

Java 9 引入了一个新的模块系统,这是 Java 应用程序必须遵循的新方式。该模块系统具有几个目的,包括:

  • 减少复杂性
  • 提高可维护性
  • 支持包含 JAR 文件的导入和导出
  • 减少类路径问题
模块

在 Java 9 中,模块定义一个代码库/库。模块具有以下部分:

  • 模块声明
  • 导出声明
  • 打包声明
  • 使用声明
  • 开放声明
  • 提供声明
模块声明

模块声明是指定模块名称、此模块依赖项的模块(以及版本)以及此模块导出的包的部分。

模块声明位于 module-info.java 文件中,并且必须在源目录的根级别中。

以下是模块声明示例:

module com.example.mymodule {
    requires com.example.myothermodule;
    exports com.example.mypackage;
}

该声明指定名称为 com.example.mymodule 的模块需要 com.example.myothermodule,并且导出 com.example.mypackage。

导出声明

导出声明指示在此模块中定义的任何公共API应导出给其他模块以使用。当其他模块需要在其代码中使用此模块中的导出部分时,必须在其模块声明中包含此模块。

这是导出声明示例:

module com.example.mymodule {
    exports com.example.mypackage;
}

该声明指定将 com.example.mypackage 导出给其他模块。

打包声明

打包声明指示在此模块中定义的所有代码的包。使用此声明时,如果代码库中的类文件不在同一目录中,则指定每个目录的名称。

以下是打包声明示例:

module com.example.mymodule {
    opens com.example.mypackage;
}

该声明指定将 com.example.mypackage 打包到 com.example.mymodule。

使用声明

使用声明指示在此模块中所需的服务,以及它们应该如何被发现。在此模块外,Java 9 还提供了 ServiceLoader 工具类来使用服务。

以下是使用声明示例:

module com.example.mymodule {
    uses com.example.myservice.impl.ServiceImpl;
}

该声明使用 com.example.myservice.impl.ServiceImpl 服务。

开放声明

开放声明指示其他模块可以反射此模块中的类。

以下是开放声明示例:

module com.example.mymodule {
    opens com.example.mypackage;
}

该声明打开了 com.example.mypackage 中反射的类。

提供声明

提供声明是一系列导出声明和使用声明。这两个声明是为了帮助您将服务的提供者映射到其消费者。

以下是提供声明示例:

module com.example.mymodule {
    provides com.example.myservice.Service with com.example.myservice.impl.ServiceImpl;
}

该声明将 com.example.myservice.Service 映射到 com.example.myservice.impl.ServiceImpl。