Java 9 中的模块Module系统

yizhihongxing

关于Java 9中的模块(Module)系统,这里为您整理了完整的攻略。请您仔细阅读以下文章。

什么是Module系统

Java 9中引入了一种新的概念——Module系统,来管理和组织代码。作为Java9中最重要的新特性之一,模块化系统的引入为我们开发、维护和交付大规模的Java应用程序提供了更多的选择和优化。

为什么引入Module系统

随着时间的推移,Java应用程序的规模越来越大,程序之间的依赖关系越来越错综复杂。在没有模块化的情况下,一个大型应用程序会有成千上万的类存在,同时还需要依赖于大量的第三方库维护才能正常工作。

这种依赖结构的复杂性和不确定性在很多时候会给开发和维护带来很大的困难。在这种情况下,Modular系统的引入就具有了很重要的意义。

什么是Module

一个Java Module是一个新的抽象概念,它在设计上避免了传统的包系统的问题。一个模块(Module)定义了一组功能,这些功能通常是在单独的源代码树中分开实现的,并且通常会结合一个版本号的概念。

一个模块(Module)被称为一组包(Package),但是,不像传统的Java包,它是一个命名空间,可以分配到一个或多个模块。

Module系统的优点

Module系统最大的优点在于它的封装性和隔离性。在模块化编程中,我们的应用程序只会依赖于它使用的模块,而其他的模块因为被封装起来而无法直接访问,这样减少了代码之间的耦合性,不仅保证了程序的稳定性和可维护性,也提升了代码的可读性和可理解性。

模块化开发需要了解的知识点

在使用Module系统前,我们需要了解一些相关知识点。

模块(Module)的声明和定义

模块(Module)的声明包括模块名称、包含的包、所需的模块和提供的服务等信息的声明。

声明可以放在一个module-info.java文件中,它位于根源代码目录的顶层目录下。

// 单个module的module-info.java
module com.example.demo {
    exports com.example.demo;
}
// 多个module的module-info.java
module com.example.demo {
    requires org.apache.commons.lang3;
    requires org.apache.commons.codec;

    exports com.example.demo;
}

模块(Module)的编译和打包

使用Module系统时,我们需要通过编译器对模块化代码进行编译,并将其打包成一个jar文件。

编译命令:

javac -d outdir [--module-source-path src] src/pkg/module-info.java src/pkg/module-src-file.java

打包命令:

jar --create [--file filename] [--module-version version] [--main-class classname] -C classes .

模块(Module)的依赖和导出

在使用Module系统时,模块之间的依赖显得尤为重要。Java为模块之间的依赖提供了两种方式:requires和exports。

  • requires:表示一个模块需要其他模块提供的功能。
  • exports:表示一个模块允许其他模块访问自己的功能。

模块(Module)的可见性

在Module系统中,一个模块对其他模块的可见性和可用性取决于它的导出和依赖关系。一个模块定义的package只能被它exports的模块访问。

示例演示

下面通过两个实例,快速了解Java 9 Module系统的基本使用。

示例一:创建Module

.
├── com.example.demo
│   ├── module-info.java
│   └── com/example/demo/HelloWorld.java

module-info.java:

module com.example.demo {
    exports com.example.demo;
}

HelloWorld.java:

package com.example.demo;

public class HelloWorld{
    public static void main(String[] args){
        System.out.println("Hello, World!");
    }
}

编译:

javac -d mods/com.example.demo src/com.example.demo/module-info.java src/com.example.demo/com/example/demo/HelloWorld.java

打包:

jar -c -f mods/com.example.demo.jar -C mods/com.example.demo .

运行:

java -p mods -m com.example.demo/com.example.demo.HelloWorld

输出:

Hello, World!

示例二:模块依赖

.
├── com.example.demo
│   ├── module-info.java
│   ├── com/example/demo/HelloWorld.java
│   └── com/example/demo/service/HelloService.java
├── com.example.demo.api
│   ├── module-info.java
│   └── com/example/demo/api/IHelloService.java
├── com.example.demo.app
│   ├── module-info.java
│   └── com/example/demo/app/HelloApplication.java
└── lib
    └── apache-commons-lang3-3.8.1.jar

com.example.demo/module-info.java:

module com.example.demo {
    requires com.example.demo.api;
    requires org.apache.commons.lang3;
    exports com.example.demo;
    exports com.example.demo.service;
}

com.example.demo/com/example/demo/HelloWorld.java:

package com.example.demo;

import com.example.demo.service.HelloService;

public class HelloWorld{
    public static void main(String[] args){
        HelloService service = new HelloService();
        System.out.println(service.getMessage());
    }
}

com.example.demo.service/HelloService.java:

package com.example.demo.service;

public class HelloService {

    public String getMessage() {
        return "Hello Java 9 Module System!";
    }
}

com.example.demo.api/module-info.java:

module com.example.demo.api {
    exports com.example.demo.api;
}

com.example.demo.api/com/example/demo/api/IHelloService.java:

package com.example.demo.api;

public interface IHelloService {
    String getMessage();
}

com.example.demo.app/module-info.java:

module com.example.demo.app {
    requires com.example.demo;
    requires com.example.demo.api;
}

com.example.demo.app/com/example/demo/app/HelloApplication.java:

package com.example.demo.app;

import com.example.demo.api.IHelloService;
import com.example.demo.service.HelloService;

public class HelloApplication {

    public static void main(String[] args) {
        IHelloService helloService = new HelloService();
        System.out.println(helloService.getMessage());
    }
}

编译:

javac --module-source-path src -d out $(find . -name "*.java")

打包:

jar --create --file mods/com.example.demo.jar --module-version 1.0 -C out/com.example.demo .
jar --create --file mods/com.example.demo.api.jar --module-version 1.0 -C out/com.example.demo.api .
jar --create --file mods/com.example.demo.app.jar --module-version 1.0 --main-class com.example.demo.app.HelloApplication -C out/com.example.demo.app .

运行:

java -p mods -m com.example.demo/app

输出:

Hello, World!

两个示例都是非常简单的,但是它们展示了Java 9中Module系统的基本用法。Java 9的Module系统是Java生态系统的一个重要里程碑,熟练掌握它可以为开发大型Java应用提供更多的便利。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 9 中的模块Module系统 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException

    当Java程序尝试使用javax.xml.transform包中的Transformer类转换XML文档时,有时会出现“javax.xml.transform.TransformerException: java.lang.NullPointerException”错误。这个错误通常表示程序在加载XML文档时遇到了一个空指针异常。以下是解决该问题的步骤和示例…

    Java 2023年5月27日
    00
  • jmeter添加自定义扩展函数之图片base64编码示例详解

    我们来详细讲解一下“jmeter添加自定义扩展函数之图片base64编码示例详解”的攻略。 准备工作 在开始之前,需要先进行一些准备工作: 确认已经安装好了jmeter。如果尚未安装,则需要先安装jmeter。 下载并安装JMeterPlugins-Extras插件包。可以从JMeterPlugins官网下载并安装该插件包。 步骤一:创建自定义函数 在jme…

    Java 2023年5月20日
    00
  • 使用cmd根据WSDL网址生成java客户端代码的实现

    使用cmd根据WSDL网址生成java客户端代码的实现,可以分为以下几个步骤: 打开cmd窗口 进入java/bin目录 敲入以下命令,其中”your_web_service_url”为你需要生成代码的WSDL服务的地址,”your_package_name”为你生成的Java代码所在的包名。 wsimport -keep -verbose your_web…

    Java 2023年5月19日
    00
  • MyBatis-Plus updateById更新不了空字符串或null的解决方法

    针对“MyBatis-Plus updateById更新不了空字符串或null的解决方法”的问题,我们可以采取以下步骤解决: 1. 前置准备 首先,我们需要明确一下 MyBatis-Plus 的 updateById 方法的定义: int updateById(T entity); 可以看到它接受一个实体对象,然后根据实体对象中的非空属性对数据库表进行更新操…

    Java 2023年5月27日
    00
  • Java使用C3P0数据源链接数据库

    使用C3P0数据源链接数据库是Java编程中常见的一个任务,下面我们来详细讲解如何完成这个任务。 安装C3P0 首先,为了使用C3P0数据源链接数据库,我们需要在项目中添加C3P0的jar包,具体步骤如下: 在 Maven 项目中,在 pom.xml 中添加以下依赖: <dependency> <groupId>com.mchange…

    Java 2023年5月19日
    00
  • IDEA搭建SpringBoot离线工程的方法

    IDEA搭建Spring Boot离线工程的方法 在本文中,我们将详细介绍如何使用 IntelliJ IDEA 搭建 Spring Boot 离线工程。我们将介绍离线工程的概念、搭建步骤和提供两个示例。 离线工程概念 离线工程是指在没有网络连接的情况下,使用本地的依赖库和插件来构建和运行 Spring Boot 应用程序。离线工程可以帮助我们在没有网络连接的…

    Java 2023年5月15日
    00
  • Java建造者模式构建复杂对象的最佳实践

    Java建造者模式是一种创建型设计模式,通过一步一步的构建复杂对象来实现构建者模式。 下面是Java建造者模式构建复杂对象的完整攻略: 步骤一:创建一个产品类 创建一个产品类,该类由多个属性组成,并提供setter和getter方法。 public class Computer { private String cpu; private String mem…

    Java 2023年5月26日
    00
  • springboot 如何使用jackson来处理实体类

    下面是“Spring Boot 如何使用 Jackson 来处理实体类”的完整攻略。 什么是Jackson? Jackson 是一个用来处理 JSON 格式数据的 Java 库,可以将 Java 对象转换为 JSON 格式数据,也可以将 JSON 格式数据转换为 Java 对象。在 Spring Boot 中,我们可以使用 Jackson 来序列化和反序列化…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部