详解JDK9特性之JPMS模块化

详解JDK9特性之JPMS模块化攻略

Java SE 9中最重要的特性之一是引入了“JPMS”——Java平台模块系统。模块化能够提供更清晰、更安全和更可靠的软件架构。本文将详细讲解JPMS模块化的相关概念,并且提供几个实际的示例来演示如何创建、编译和运行模块化的应用程序。

JPMS:Java平台模块系统概述

Java平台模块系统是一个新的、标准的Java SE 9特性,其目标是提供一种更加模块化的方法来组织和部署Java应用程序和库。基本上,这意味着将应用程序分解为不同的模块,每个模块都可以定义其属性和清晰的API,并且这些模块相互之间可以通信和协同工作。

Java SE 9中,一个模块定义了一个名为“module-info.java”的文件,其中包含该模块的元数据信息。模块可以包含其他模块和类,或者可以公开其组件给其他模块使用。在编译和部署时,每个模块都被视为一个单独的单元。

创建一个模块

以下是一个简单的示例模块,定义了一个名为“com.example.greeting”的模块:

module com.example.greeting {
    exports com.example.greeting.api;
    requires java.base;
}

在此示例中,模块要求Java基础模块并导出com.example.greeting.api包。这意味着只有在这种情况下这个包中的类和方法才能被其他模块访问。

编译一个模块

要编译一个模块,您需要使用新的命令行选项“-module-source-path”,如下所示:

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

在这里,“-d”参数指定输出目录,而“--module-source-path”参数指定模块源文件的根目录。请注意,此命令还使用“find”命令查找匹配“*.java”模式的所有源文件。

运行一个模块

要运行一个模块,在命令行中使用“--module”的新选项,如下所示:

java --module-path mods --module com.example.greeting/com.example.greeting.Main

在这里,“--module-path”参数指定模块路径,该路径包含编译的模块。而“--module”参数指定要运行的模块及其主类。

示例:模块化的HTTP服务器

下面是一个更复杂的示例,展示了如何创建一个模块化的HTTP服务器。该服务器使用HTTP组件和一个“greeting”模块,该模块提供一条简单的问候。

创建HTTP服务器模块

文件:module-info.java

module com.example.httpserver {
    requires jdk.httpserver;
    exports com.example.httpserver;
}

在此模块中,我们要求JDK的HTTP服务器组件,并导出一个公开的包“com.example.httpserver”。

创建问候模块

文件:module-info.java

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

在此模块中,我们仅导出一个公开的包“com.example.greeting.api”。

创建HTTP服务器Main类

文件:Main.java

package com.example.httpserver;

import com.example.greeting.api.Greeter;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
        server.createContext("/", new HttpHandler() {
            public void handle(HttpExchange exchange) throws IOException {
                String response = Greeter.greet("World");
                exchange.sendResponseHeaders(200, response.length());
                OutputStream os = exchange.getResponseBody();
                os.write(response.getBytes());
                os.close();
            }
        });
        server.start();
    }
}

在此示例中,Main类使用我们的greeting模块中的代码生成一个问候,然后将其发送回HTTP客户端。

编译和运行HTTP服务器

要编译和运行服务器,首先需要执行以下命令来编译两个模块:

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

现在,我们可以启动HTTP服务器,方法如下:

java --module-path mods --module com.example.httpserver/com.example.httpserver.Main

在这个命令中,“--module-path”参数指定了我们的模块路径,而“--module”参数指定了我们要运行的模块及其主类。

总结

Java SE 9引入的JPMS模块化提供了一种新的、灵活的方式来组织和部署Java应用程序和库。本文章介绍了如何创建、编译和运行一个模块化的应用程序,同时提供了两个实际的示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JDK9特性之JPMS模块化 - Python技术站

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

相关文章

  • java GUI界面初步入门示例【AWT包】

    让我来详细讲解一下“java GUI界面初步入门示例【AWT包】”的完整攻略。 Java GUI界面初步入门示例【AWT包】 环境准备 在开始之前,需要确保你的电脑上已经安装了Java开发环境(JDK)和IDE(Integrated Development Environment),例如Eclipse或IntelliJ IDEA。这里以Eclipse为例。 …

    Java 2023年5月23日
    00
  • Spring Cloud zuul自定义统一异常处理实现方法

    来详细讲解一下“Spring Cloud zuul自定义统一异常处理实现方法”的完整攻略。 1. 背景介绍 Zuul 是 Netflix 出品的一个基于 JVM 用于构建可伸缩的微服务架构的 API 网关服务器。Zuul 的主要功能是路由转发和过滤器。路由功能是微服务的一部分,它将请求路由到相应的服务。Zuul 还能够对请求进行过滤,其中最常用的是安全过滤器…

    Java 2023年5月27日
    00
  • SpringMVC数据页响应ModelAndView实现页面跳转

    下面是详细讲解“SpringMVC数据页响应ModelAndView实现页面跳转”的完整攻略: 1. ModelAndVew概述 在SpringMVC中,Controller层处理完业务逻辑后,需要将处理好的数据返回到前端页面进行展示,而ModelAndView就是一个很好的方案。ModelAndView是SpringMVC中的一个类,它用来处理Contro…

    Java 2023年6月15日
    00
  • java实现学生教师管理系统

    Java实现学生教师管理系统攻略 1. 系统概述 学生教师管理系统是一个管理学校、教学活动以及学生信息和教师信息的系统。该系统主要包括三个主要模块:学生管理模块、教师管理模块和课程管理模块。 2. 系统功能 2.1 学生管理模块 该模块主要包含学生的基本信息、课程信息、成绩信息和考勤信息。具体功能包括: 学生信息的添加、修改、删除和查询 课程信息的添加、修改…

    Java 2023年5月23日
    00
  • Java中ArrayList的工作原理详解

    那么接下来我将详细讲解“Java中ArrayList的工作原理详解”的完整攻略。 1. ArrayList的简介 ArrayList是Java中的一种集合类型,它实现了List接口,它是一个可调整大小的数组实现,用于存储对象。它是线程不安全的,因此不能用于多线程应用程序中。ArrayList不保证元素的有序性,因此它不是一个根据位置访问的最佳选择,但是它可以…

    Java 2023年5月26日
    00
  • 详解android studio游戏摇杆开发教程,仿王者荣耀摇杆

    Android Studio游戏摇杆开发教程 本教程将介绍如何在Android Studio中开发游戏摇杆控件,以实现类似于王者荣耀游戏的摇杆控制功能。本教程将涉及到如下内容: 摇杆的原理及实现技术; 摇杆控件的设计; 使用摇杆控件实现王者荣耀摇杆控制功能。 摇杆原理及实现技术 摇杆控件常用的实现方式是利用手指在摇杆区域内滑动的距离和方向来实现控制操作。我们…

    Java 2023年5月26日
    00
  • Java基础知识之BufferedReader流的使用

    Java基础知识之BufferedReader流的使用 BufferedReader是Java中一个常用的字符输入流,常用于读取文本文件中的数据。相较于其他的字符输入流,BufferedReader具有缓冲功能,能够更加高效地读取文件的内容。本文将详细介绍BufferedReader流的使用,包括如何创建、如何读取文件内容、如何关闭流等。 创建Buffere…

    Java 2023年5月26日
    00
  • Visual Studio Code上添加小程序自动补全插件的操作方法

    操作 Visual Studio Code 上添加小程序自动补全插件的具体步骤如下: 1. 打开 Visual Studio Code 首先,打开你的 Visual Studio Code 编辑器。 2. 打开扩展面板 点击左侧菜单栏最后一个图标,打开 Visual Studio Code 的扩展面板,这里可以搜索并将插件安装到编辑器中。 3. 搜索插件 在…

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