📜  Java9 Module系统(1)

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

Java 9 Module 系统

Java 9 Module 系统是 Java 9 中引入的一项新特性。本文将介绍 Java 9 Module 系统的概念、目的、如何使用,并提供一些有用的示例代码。

概念

Java 9 Module 系统是面向模块化编程的一种解决方案。它将 Java 应用程序分解为模块,每个模块都具有清晰的 API 和边界,并可以访问其他模块。

从历史上看,Java 应用程序一直以 JAR(Java Archive)文件作为最小部署单元。这种部署方式非常灵活,但是也存在一些问题。例如,应用程序的类路径会变得非常复杂,冲突会频繁发生,不易管理和维护。

Java 9 Module 系统通过模块化应用程序代码,可解决上述问题。

目的

Java 9 Module 系统的主要目的是提高 Java 应用程序的安全性、可维护性和可控性。Module 系统可以实现以下目标:

  • 隔离代码:每个模块都有自己的 Classpath 和命名空间,这样可以避免类冲突。
  • 显式依赖:每个模块都明确声明其对其他模块的依赖关系,这样可以避免意外的依赖。
  • 小巧清晰:每个模块都由清晰的 API 和边界组成。
如何使用
定义模块

定义一个模块需要创建一个 module-info.java 文件,并在其中声明该模块的名称、依赖关系和导出包。

例如,下面是一个名为 com.mycompany.mymodule 的模块的 module-info.java 文件:

module com.mycompany.mymodule {
    requires java.base;
    requires com.google.gson;
 
    exports com.mycompany.mymodule.api;
}

在上面的示例中,我们定义了一个名为 com.mycompany.mymodule 的模块。它声明了它对 java.base 和 com.google.gson 的依赖,并且导出了 com.mycompany.mymodule.api 包。

我们可以使用以下命令编译模块代码:

javac -d [output_directory] module-info.java [source_files]
运行模块

要启动使用模块的应用程序,我们必须指定应用程序的模块路径和主类。Module 路径是存储所有模块的目录或 JAR 文件的列表,可以通过以下命令指定:

java --module-path [module_path] -m [module_name]/[main_class]

例如,要以 com.mycompany.mymodule 模块为示例运行应用程序 MyApplication,可以使用以下命令:

java --module-path [module_path] -m com.mycompany.mymodule/com.mycompany.mymodule.MyApplication

在上面的示例中,我们假设 MyApplication 类是 com.mycompany.mymodule 模块中的主类。

类路径

Java 9 Module 系统与传统的类路径是兼容的。如果我们运行没有模块定义的代码,则它将在类路径上查找所有的 JAR 文件。

示例

以下是一个简单的示例,展示如何编写和使用模块。

MyLibrary 模块

一个名为 MyLibrary 的模块,提供了一个公共 API( com.mycompany.mylibrary.api 包),实现了该 API 的私有实现( com.mycompany.mylibrary.impl 包)。

module-info.java

module com.mycompany.mylibrary {
    exports com.mycompany.mylibrary.api;
}

MyClass.java

package com.mycompany.mylibrary.impl;
 
import com.mycompany.mylibrary.api.MyInterface;
 
public class MyClass implements MyInterface {
    public void doSomething() {
        System.out.println("MyClass.doSomething()");
    }
}
MyApplication 模块

一个基于 MyLibrary 模块的简单应用程序:

module-info.java

module com.mycompany.myapp {
    requires com.mycompany.mylibrary;
}

MyApplication.java

package com.mycompany.myapp;
 
import com.mycompany.mylibrary.api.MyInterface;
import com.mycompany.mylibrary.impl.MyClass;
 
public class MyApplication {
    public static void main(String[] args) {
        MyInterface myObj = new MyClass();
        myObj.doSomething();
    }
}

现在我们可以使用以下命令编译和运行 MyApplication 模块:

javac -d [output_directory] MyApplication.java
javac -d [output_directory] MyClass.java
javac -d [output_directory] module-info.java
javac -d [output_directory] com.mycompany.mylibrary.api/*.java
javac -d [output_directory] com.mycompany.mylibrary.impl/*.java
 
java --module-path [module_path] -m com.mycompany.myapp/com.mycompany.myapp.MyApplication
总结

Java 9 Module 系统提供了一种全新的方式来构建和管理 Java 应用程序。模块化程序设计能够提供更好的安全性、可维护性和可控性,并且使开发者能够构建更具重用性和可扩展性的应用程序。