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日

相关文章

  • Spring MVC中自定义拦截器的实例讲解

    以下是关于“Spring MVC中自定义拦截器的实例讲解”的完整攻略,其中包含两个示例。 Spring MVC中自定义拦截器的实例讲解 拦截器是Spring MVC中的一个重要组件,它可以在请求到达Controller之前或之后执行一些操作。在本文中,我们将讲解如何在Spring MVC中自定义拦截器。 步骤一:创建Maven项目 打开IntJ IDEA,选…

    Java 2023年5月17日
    00
  • java实现oracle插入当前时间的方法

    要使用Java实现Oracle插入当前时间的方法,可以使用Java API将当前时间作为字符串并将其插入Oracle数据库的日期字段。以下是实现此目的的步骤: 1. 准备数据库连接 在Java中,可以使用JDBC API来连接到Oracle数据库。请确保您已经下载了适当的Oracle JDBC驱动程序,并将其添加到您的Java应用程序的类路径中。 Strin…

    Java 2023年5月20日
    00
  • struts2+jquery实现ajax登陆实例详解

    我将详细讲解“struts2+jquery实现ajax登陆实例详解”的完整攻略。 1. 前言 本文将介绍如何使用 Struts2 和 jQuery 实现前后端的交互,实现 AJAX 登录功能。 2. 后端代码 2.1 登录 Action 首先,我们需要创建一个登陆的 Action。在 Struts.xml 中配置该 Action 的入口路径。 <act…

    Java 2023年5月20日
    00
  • jsp中点击图片弹出文件上传界面及预览功能的实现

    要实现JSP中点击图片弹出文件上传界面及预览功能,可以采用以下步骤: 导入相关依赖库和设置表单 首先需要在JSP页面中导入相关的依赖库,比如jQuery、layer等,以及设置一个表单用于文件上传。示例代码如下: <head> <script src="https://cdn.bootcdn.net/ajax/libs/jquer…

    Java 2023年6月15日
    00
  • Java应用/JVM宕机排查步骤操作

    对于Java应用/JVM宕机排查步骤操作,我们需要进行以下的步骤: 1. 收集日志信息 Java应用程序和JVM宕机时通常会生成日志文件。首先,我们需要定位日志文件,并阅读日志文件,以了解宕机原因。常见的Java日志文件包括: Java虚拟机日志(JVM Log) Tomcat日志文件(catalina.out),如果我们的应用程序是部署在Tomcat容器中…

    Java 2023年5月25日
    00
  • 快速建立Servlet和JSP的运行、调试和编译环境

    快速建立Servlet和JSP的运行、调试和编译环境的攻略如下: 环境准备 安装JDK 前往Oracle官网下载JDK安装包(根据操作系统和位数选择相应版本):https://www.oracle.com/technetwork/java/javase/downloads/index.html 下载完成后,按照安装提示进行安装并配置环境变量。 安装Tomca…

    Java 2023年5月19日
    00
  • 简单介绍十几款常用的画架构图流程图的软件

    简单介绍十几款常用的画架构图流程图的软件 draw.io draw.io是开源免费的在线画图工具,还提供桌面版本。 特性: 实时协作; 支持在线离线版本; 存储支持多种方式:Google Drive, OneDrive, GitHub, GitLab, Dropbox等; 许多丰富的图标库。 ProccessOn ProccessOn是一款优秀的国产在线协作…

    Java 2023年4月19日
    00
  • Java实现解数独的小程序

    Java实现解数独的小程序攻略 概述 本文将介绍如何使用Java实现一个解数独的小程序。数独是一种数字逻辑游戏,玩家需要填入数字,使得每一行、每一列和每个九宫格内的数字都不重复。 步骤 1. 网格建模 第一步是建立数独网格的模型。我们可以使用一个二维数组,它的每个元素代表数独中的一个格子。元素的值为0表示空格,其他数字表示该格的数值,例如1到9。 int[]…

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