详解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技术站