Java 9 中的模块Module系统

关于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日

相关文章

  • JSP页面跳转方法小结

    JSP页面跳转方法小结 在JSP编程中,页面跳转是很常见的需求。本文将详细讲解JSP页面跳转的方法及其使用场景。 转发(Forward) 概述 转发是指在服务器内部,将请求资源(request)转移到另一个资源上的过程。使用转发时可以在服务器内部跳转页面,且浏览器地址栏中的URL不会发生改变。 使用方法 JSP的转发可以使用request对象的getRequ…

    Java 2023年6月15日
    00
  • 详解 Corba开发之Java实现Service与Client

    详解 Corba开发之Java实现Service与Client 什么是 Corba Common Object Request Broker Architecture(通用对象请求代理架构,简称CORBA)是一种用于构建分布式系统的中间件技术。它可以实现对象之间的交互,并提供了完整的面向对象的支持。CORBA尤其适用于企业级应用,包括电信、金融、航空、医疗等…

    Java 2023年5月19日
    00
  • Java虚拟机JVM性能优化(一):JVM知识总结

    在进行Java虚拟机JVM性能优化前,我们需要全面了解JVM的相关知识,这篇文章将对JVM进行总结,从而帮助我们提高程序性能。 JVM的定义及作用 JVM是Java虚拟机的缩写,它是Java程序能够在不同平台上运行的基础。JVM通过将Java字节码解释成平台相关的机器语言来实现这一功能,从而使Java程序能够在不同的操作系统上都能正常运行。 JVM架构 JV…

    Java 2023年5月19日
    00
  • JDBC以反射机制加载类注册驱动连接MySQL

    JDBC以反射机制加载类注册驱动连接MySQL的攻略如下: 导入相关的JDBC驱动jar包。假设我们使用MySQL数据库,需要下载并导入mysql-connector-java.jar包。如果不清楚如何导入jar包,可以自行查阅相关教程。 使用反射机制动态加载类。JDBC4.0以后的版本,不需要显式地调用Class.forName()方法加载驱动程序,但是我…

    Java 2023年6月16日
    00
  • Java实现计网循环冗余检验算法的方法示例

    让我详细介绍一下“Java实现计网循环冗余检验算法的方法示例”的攻略。这里我将分为以下几个方面进行讲解: 简介及算法原理 Java代码实现步骤 示例说明1 示例说明2 总结 1. 简介及算法原理 CRC(Cyclic redundancy check)即循环冗余校验码,是一种基于校验码的数据传输完整性检查方法。它能够检测出所有单个比特以及更多数量的比特出错。…

    Java 2023年5月19日
    00
  • ColdFusionMX 编程指南 安装教程

    ColdFusionMX 编程指南 安装教程 1. 下载安装文件 首先,访问 Adobe 官网的 ColdFusionMX 下载页面,下载 ColdFusionMX 的安装文件(通常是一个 .exe 或 .dmg 文件)。 2. 安装 ColdFusionMX Windows 系统 如果你使用的是 Windows 操作系统,双击下载的安装文件开始安装。按照安…

    Java 2023年6月15日
    00
  • Java C++ 算法leetcode828统计子串中唯一字符乘法原理

    Java C++ 算法leetcode828统计子串中唯一字符乘法原理 题目描述 给定一个字符串,你需要统计其中唯一字符的个数。 具体地,你需要统计所有的出现恰好一次的字符的个数。 示例 输入: “ABCDEF”输出: 6解释: 出现一次的字符有 ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’,因此唯一字符的个数为 6。 输入: “ABCDEFAB…

    Java 2023年5月19日
    00
  • 利用Dockerfile制作java运行环境的镜像的方法步骤

    准备Java应用程序 在制作Java运行环境的Docker镜像前,需要先准备好Java应用程序,比如一个Java Web应用程序,这里以名为“example”的Spring Boot应用程序为例。 编写Dockerfile Dockerfile是Docker镜像的构建脚本,需要在其中指定Docker镜像的环境以及各种组件。以下是一个基础的Dockerfile…

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