当前位置: 首页 > news >正文

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


第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 核心模块详解
1. java.base(基础核心模块)
  • 功能:包含 Java 最基础的类库,如 ObjectString、集合框架、IO/NIO、安全等。
  • 特性
    • 所有模块隐式依赖 java.base(无需显式声明 requires java.base)。
    • 提供关键包:java.langjava.utiljava.iojava.nio
  • 示例
    // 任何模块自动依赖 java.base
    module com.myapp {// 无需 requires java.baseexports com.myapp.api;
    }
    
2. java.sql(数据库连接模块)
  • 功能:提供 JDBC API(ConnectionStatementResultSet)。
  • 依赖
    module com.myapp {requires java.sql; // 显式声明依赖
    }
    
3. java.net.http(HTTP 客户端模块)
  • 功能:JDK 9 新增的 HTTP/2 客户端(非孵化器版本需 JDK 11+)。
  • 示例
    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。

场景:构建一个仅依赖 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 核心模块依赖示例
示例1:依赖 java.basejava.logging
module com.myapp {requires java.logging; // 显式依赖日志模块
}
示例2:多模块协作
// 模块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 等工具构建轻量化运行时,并遵循显式依赖管理原则,以充分发挥模块化优势。

相关文章:

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

第3章&#xff1a;模块化JDK&#xff1a;JDK模块结构与核心模块 JDK 9 将自身拆分为一系列模块&#xff0c;彻底告别传统的“单一JAR&#xff08;如 rt.jar&#xff09;”模式。本章深入解析 JDK 的模块化架构、核心模块功能及开发者如何高效利用这些模块。 3.1 JDK 模块化设计…...

每日一题——缺失的第一个正整数

缺失的第一个正整数 题目描述进阶&#xff1a;数据范围&#xff1a; 示例示例 1示例 2示例 3 题解思路代码实现代码解释复杂度分析总结 题目描述 给定一个无重复元素的整数数组 nums&#xff0c;请你找出其中没有出现的最小的正整数。 进阶&#xff1a; 时间复杂度&#xff…...

CEF132 编译指南 MacOS 篇 - 基础开发工具安装实战 (二)

1. 引言 在 macOS 平台上编译 CEF132 之前&#xff0c;首要任务是搭建一个完善的开发环境。与 Windows 和 Linux 环境不同&#xff0c;macOS 的开发环境主要以 Xcode 为核心。本篇将作为 CEF132 编译指南系列的第二篇&#xff0c;详细指导读者如何在 macOS 系统上安装和配置 X…...

vi 是 Unix 和 Linux 系统中常用的文本编辑器

vi是 Unix 和 Linux 系统中常用的文本编辑器&#xff0c;它有几种不同的模式&#xff0c;其中最常用的是命令模式和插入模式。光标控制主要在命令模式下进行&#xff0c;以下是一些常用的vi命令来控制光标位置&#xff1a; • h,j,k,l&#xff1a;分别用于将光标向左、向下、向…...

SwanLab x verl:可视化LLM强化学习后训练教程

文章目录 介绍Verl和SwanLab1. 环境安装2. 使用方法3. 查看训练日志 介绍Verl和SwanLab verl 是一个灵活、高效且可用于生产环境的强化学习&#xff08;RL&#xff09;训练框架&#xff0c;专为大型语言模型&#xff08;LLMs&#xff09;的后训练设计。它由字节跳动火山引擎团…...

职场到校园,初心未改:我的2024年

Hi&#xff0c;大家好&#xff0c;我是几何心凉。 其实早就想写一份复盘文章&#xff0c;正好借助2024年度博客之星的评选机会&#xff0c;来写下这篇总结。回望过去&#xff0c;感慨颇多。自从加入CSDN平台以来&#xff0c;已经见证了许多博主的来去匆匆&#xff0c;各类创作…...

C++基础知识学习记录—引用

1、引用的概念 概念&#xff1a;引用相当于给变量取个别名 对引用进行操作与直接操作变量相同&#xff0c;注意引用类型与变量类型一致 #include<iostream> using namespace std; int main(){int a10;int& cite_a a;//操作引用cite_a 与操作变量a完全一样cout &l…...

AWS Savings Plans 监控与分析工具使用指南

一、背景介绍 1.1 什么是 Savings Plans? AWS Savings Plans 是一种灵活的定价模式,通过承诺持续使用一定金额的 AWS 服务来获得折扣价格。它可以帮助用户降低 AWS 使用成本,适用于 EC2、Fargate 和 Lambda 等服务。 1.2 为什么需要监控? 优化成本支出跟踪使用情况评估投…...

【AI学习】关于 DeepSeek-R1的几个流程图

遇见关于DeepSeek-R1的几个流程图&#xff0c;清晰易懂形象直观&#xff0c;记录于此。 流程图一 来自文章《Understanding Reasoning LLMs》&#xff0c; 文章链接&#xff1a;https://magazine.sebastianraschka.com/p/understanding-reasoning-llms?continueFlagaf07b1a0…...

C++ ——从C到C++

1、C的学习方法 &#xff08;1&#xff09;C知识点概念内容比较多&#xff0c;需要反复复习 &#xff08;2&#xff09;偏理论&#xff0c;有的内容不理解&#xff0c;可以先背下来&#xff0c;后续可能会理解更深 &#xff08;3&#xff09;学好编程要多练习&#xff0c;简…...

【图片转换PDF】多个文件夹里图片逐个批量转换成多个pdf软件,子文件夹单独合并转换,子文件夹单独批量转换,基于Py的解决方案

建筑设计公司在项目执行过程中&#xff0c;会产生大量的设计图纸、效果图、实景照片等图片资料。这些资料按照项目名称、阶段、专业等维度存放在多个文件夹和子文件夹中。 操作需求&#xff1a;为了方便内部管理和向客户交付完整的设计方案&#xff0c;公司需要将每个项目文件…...

前端学习之Flex布局

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Flex布局示例</title><style>.conta…...

游戏引擎学习第97天

回顾昨天并计划今天 在这期节目中&#xff0c;主要讲解了光照的概念&#xff0c;并进一步讨论了法线贴图光照的实现。节目的内容大致分为几个部分&#xff1a; 光照的基础概述&#xff1a;讨论了光的工作原理以及如何在编程图形时需要考虑光照问题。尽管这些概念并没有深入到…...

Mysql中存储引擎各种介绍以及应用场景、优缺点

概述 MySQL 提供了多种存储引擎&#xff0c;每种引擎有不同的特点和适用场景。以下是几种常见的 MySQL 存储引擎的详细介绍&#xff0c;包括它们的底层工作原理、优缺点&#xff0c;以及为什么 MySQL 默认选择某种引擎。 1. InnoDB 底层工作原理&#xff1a; 事务支持&#…...

PHP 运算符

PHP 运算符 概述 PHP 是一种广泛使用的开源服务器端脚本语言,它具有丰富的运算符集,这些运算符是编写 PHP 程序的基础。运算符用于执行各种数学、逻辑和比较操作。本篇文章将详细介绍 PHP 中常用的运算符,包括算术运算符、比较运算符、逻辑运算符、赋值运算符等。 算术运…...

Vue全流程--Vue3.0与Vue2.0响应式原理对比

Vue2中数据的响应式 需要使用Vue.set这么一个api&#xff0c;修改数据 需要使用Vue.delete这么一个api&#xff0c;删除数据 数据代理这个当面的理解可以看看我前面文章Vue全流程--数据代理的理解以及在Vue中的应用-CSDN博客 Vue3中数据的响应式 Vue3使用proxy这个api实现…...

C语言学习笔记:子函数的调用实现各个位的累加和

在C语言程序学习之初&#xff0c;我们都会学习如何打印 hello world&#xff0c;在学习时我们知道了int main&#xff08;&#xff09;是主函数&#xff0c;程序从main函数开始执行&#xff0c;这是流程控制的一部分内容。在主函数中我们想要实现一些功能&#xff0c;比如求各个…...

【大模型】本地部署DeepSeek-R1:8b大模型及搭建Open-WebUI交互页面

本地部署DeepSeek-R1:8b大模型 一、摘要及版本选择说明1.1 摘要1.2 版本选择 二、下载并安装Ollama三、运行DeepSeek-R1:8b大模型四、安装Open WebUI增强交互体验五、关闭Ollama开机自动启动六、DeepSeek大模型启停步骤 一、摘要及版本选择说明 1.1 摘要 作为一名对 AI 和生成…...

Python 调用 Stabilityai API在本地生成图像

Python 调用 Stabilityai API在本地生成图像 摘要功能 代码结构关键技术代码下载立即体验 摘要 本程序利用硅基流动目前的免费 stabilityai/stable-diffusion-2-1 模型API&#xff0c;生成图像并下载到本地&#xff0c;用户可以通过输入描述性提示词来获取相应的图像。使用Pyt…...

Python3中异常处理:try-finally语句的示例

一. 简介 前面一篇文章简单学习了 try-finally语句结构&#xff0c;执行过程、以及使用场景。文章如下&#xff1a; Python3中异常处理&#xff1a;try-finally语句-CSDN博客 本文写一些简单的示例来继续学习 try-finally语句的使用。 二. Python3中异常处理&#xff1a;try…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...