2. 4 模块化JDK:JDK模块结构与核心模块

devtools/2025/2/11 6:45:01/

第3章:模块化JDK:JDK模块结构与核心模块

JDK 9 将自身拆分为一系列模块,彻底告别传统的“单一JAR(如 rt.jar)”模式。本章深入解析 JDK 的模块化架构、核心模块功能及开发者如何高效利用这些模块。


3.1 JDK 模块化设计概览
设计目标
  1. 模块化拆分:将 JDK 代码库划分为 94 个独立模块(JDK 17 扩展至约 100 个)。
  2. 强封装:隐藏内部 API(如 sun.misc),仅公开标准 API。
  3. 按需加载:允许应用仅依赖所需模块,减少运行时内存占用。
模块分类

JDK 模块分为三类:

  1. 标准模块(Standard Modules):以 java.* 开头的模块(如 java.base),提供核心 API。
  2. JDK 专用模块(JDK-specific Modules):以 jdk.* 开头的模块(如 jdk.unsupported),包含 JDK 实现细节。
  3. 聚合模块(Aggregator Modules):如 java.se,仅用于聚合其他模块,无实际代码。

3.2 核心模块详解
javabase_23">1. java.base(基础核心模块)
  • 功能:包含 Java 最基础的类库,如 ObjectString、集合框架、IO/NIO、安全等。
  • 特性
    • 所有模块隐式依赖 java.base(无需显式声明 requires java.base)。
    • 提供关键包:java.langjava.utiljava.iojava.nio
  • 示例
    java">// 任何模块自动依赖 java.base
    module com.myapp {// 无需 requires java.baseexports com.myapp.api;
    }
    
javasql_37">2. java.sql(数据库连接模块)
  • 功能:提供 JDBC API(ConnectionStatementResultSet)。
  • 依赖
    java">module com.myapp {requires java.sql; // 显式声明依赖
    }
    
javanethttpHTTP__46">3. java.net.http(HTTP 客户端模块)
  • 功能:JDK 9 新增的 HTTP/2 客户端(非孵化器版本需 JDK 11+)。
  • 示例
    java">module com.myapp {requires java.net.http;
    }
    
4. jdk.unsupported(非标准支持模块)
  • 功能:提供对部分内部 API 的临时访问(如 sun.misc.Unsafe),但强烈不建议使用。
  • 警告:此模块可能在未来的 JDK 版本中被移除或调整。

3.3 模块依赖关系与查看方法
1. 查看模块依赖树

使用 java --list-modules 列出所有模块:

java --list-modules
# 输出示例:
java.base@17.0.1
java.sql@17.0.1
jdk.unsupported@17.0.1
2. 查看模块内容

使用 java --describe-module <模块名> 显示模块详细信息:

java --describe-module java.sql
# 输出示例:
java.sql@17.0.1
requires java.base mandated
requires java.logging transitive
requires java.xml transitive
exports java.sql
exports javax.sql
...

3.4 模块化 JDK 的优势
  1. 减少内存占用

    • 传统模式:加载完整的 rt.jar(约 60 MB)。
    • 模块化模式:仅加载必需模块(如 java.base 约 15 MB)。
  2. 增强安全性

    • 内部 API(如 com.sun.*)默认不可访问,避免滥用。
  3. 明确依赖管理

    • 开发者必须显式声明模块依赖,避免隐式类路径问题。

3.5 实战:定制化 JRE 生成

通过 jlink 工具创建仅包含所需模块的最小化 JRE。

javabase__javasql__105">场景:构建一个仅依赖 java.basejava.sql 的控制台应用。
jlink --module-path $JAVA_HOME/jmods \--add-modules java.base,java.sql \--output my-custom-jre

生成的 JRE 结构

my-custom-jre/
├── bin/
├── conf/
├── lib/          # 仅包含 java.base 和 java.sql 的模块
└── release

3.6 核心模块依赖示例
javabase__javalogging_125">示例1:依赖 java.basejava.logging
java">module com.myapp {requires java.logging; // 显式依赖日志模块
}
示例2:多模块协作
java">// 模块A:提供工具类
module com.utils {exports com.utils;
}// 模块B:依赖模块A和JDK的XML模块
module com.myapp {requires com.utils;requires java.xml;
}

3.7 常见问题与解决
问题解决方案
模块未找到(如 java.sql确认模块名拼写正确,且模块存在于 $JAVA_HOME/jmods 目录。
访问内部 API 失败使用 --add-exports 开放访问(临时方案),或改用标准 API。
生成的 JRE 缺少必要模块检查 jlink--add-modules 参数是否包含所有依赖模块。

3.8 总结

JDK 9 的模块化架构通过拆分核心功能、强封装和按需加载,显著提升了 Java 应用的灵活性与安全性。开发者应熟悉核心模块(如 java.base)的作用,掌握 jlink 等工具构建轻量化运行时,并遵循显式依赖管理原则,以充分发挥模块化优势。


http://www.ppmy.cn/devtools/157853.html

相关文章

【通俗易懂说模型】反向传播(附多元分类与Softmax函数)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …

【多模态大模型】系列3:语义分割(LSeg、GroupViT)

目录 1 LSeg2 Group ViT 1 LSeg LANGUAGE-DRIVEN SEMANTIC SEGMENTATION LSeg是第一篇将CLIP应用于语义分割的论文。它的分割的效果拔群&#xff0c;容错能力也很高&#xff1a; 模型总览图跟CLIP很像&#xff1a; 对于图像链路&#xff1a;输入一张图片&#xff0c;进入分割…

鸿蒙NEXT开发-鸿蒙三方库

基本介绍 三方库是开发者在系统能力的基础上进行了一层具体功能的封装&#xff0c;对其能力进行拓展&#xff0c;提供更加方便的接口&#xff0c;提升开发效率的工具。 我们在之前的课程中学习过如何安装三方库axios了&#xff0c;我们大家可以通过ohpm install ohos/axios进行…

变化检测论文阅读合集

1. ChangeCLIP: Remote sensing change detection with multimodal vision-language representation learning 作者&#xff1a;Sijun Dong a, Libo Wang b, Bo Du c, Xiaoliang Meng a,* 年份&#xff1a;2024 研究方法/模型&#xff1a; 重构原始CLIP&#xff1a;提取双时…

【前端】几种常见的跨域解决方案

在前端开发中&#xff0c;跨域问题是常见的挑战。以下是几种常见的跨域解决方案&#xff1a; 1. Nginx反向代理 使用 Nginx 进行反向代理是解决跨域问题的一种常见方式。Nginx 会充当一个中间代理服务器&#xff0c;接收来自前端的请求并将其转发到实际的后端 API 服务&#…

内蒙古蒙东某露天煤矿隆起自动化监测

1. 项目简介 该矿山是一家集煤炭生产、加工、销售于一体的国有大型露天煤矿&#xff0c;是国家重点建设的13个大型煤炭基地之一&#xff0c;是国家能源重点发展地区。该矿脉储量丰富、资源可靠、开采条件优越、市场条件良好&#xff0c;煤种属于老年褐煤&#xff0c;具有挥发分…

ES传输带宽优化方案

背景&#xff1a;目前日志从kafka中消费后转存ES,是通过批量发送的方式打入ES&#xff0c;但是如果数据量很大那么就会占用很多的带宽&#xff0c;而目前正在降本增效&#xff0c;无法增加带宽或者服务节点。 源码在最下方&#xff01;&#xff01; 限流牺牲磁盘作为代价 从…

【AI学习】LLM的发展方向

个人的思考&#xff0c;请大家批评。 这一轮AI浪潮&#xff0c;叙事的主要逻辑就是scaling law&#xff0c;模型越大&#xff0c;性能越好&#xff0c;投入越大&#xff0c;性能越好&#xff0c;回报越高&#xff0c;等等。当然&#xff0c;首先要有一个能够scaling的模型架构…