Java 中类加载怎么理解 Java 模块化系统(JPMS)中 layers 对传统类加载层级结构的冲击

舞姬之光

舞姬之光

2026-07-24

744人浏览

原创

modulelayer是jpms提供的可编程模块分层模型,替代扁平classpath,为插件提供独立模块图、专属classloader及显式读取边界,实现多版本依赖隔离。

java 中类加载怎么理解 java 模块化系统(jpms)中 layers 对传统类加载层级结构的冲击

Java 模块化系统(JPMS)中的 ModuleLayer 并不是对传统类加载器层级的“修补”,而是用一套新的、可编程的、层次化的模块加载模型,替换了过去扁平、隐式、全局共享的类路径(classpath)加载逻辑。它不冲击旧机制,而是提供了一种更可控、更隔离的替代路径——尤其在插件、多版本依赖、动态扩展等场景中,传统双亲委派模型已力不从心。

传统类加载:扁平信任 + 隐式共享

在 Java 8 及之前,所有 JAR 都被加载到同一个 运行时类空间 中,由启动类加载器、扩展类加载器、应用类加载器构成固定三层结构,遵循双亲委派。但关键问题是:

  • 一旦某个类被任意类加载器加载,它就对整个应用可见(只要访问权限允许)
  • 没有机制阻止两个不同版本的 Jackson 被同时加载——JVM 不识别“版本”,只认全限定类名
  • 无法为插件 A 和插件 B 分别准备互不干扰的依赖环境

ModuleLayer:显式分层 + 独立模块图

JPMS 引入 ModuleLayer 后,每个层都拥有自己的:

  • 独立的模块图(module graph),包含该层内所有模块及其 requires 关系
  • 专属的 ClassLoader 实例(通常为 LayerClassLoader),只负责加载本层模块的类
  • 明确的读取权限(readability)边界:一个层里的模块默认 不可见 另一层的模块,除非显式建立 layer-to-layer 的 reads 关系

例如,主机应用运行在 boot layer(含 JDK 模块)和 app layer(主业务模块)上;当加载插件 A 时,可创建新 ModuleLayer,其内部包含 jackson-databind 2.14 和插件 A 自身模块;插件 B 则另起一层,使用 jackson-databind 2.10 ——二者类空间完全隔离,com.fasterxml.jackson.databind.ObjectMapper 在各自层里是不同类,不会冲突。

Java JDK 25
Java JDK 25

Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。

下载

Layer 与 ClassLoader 的关系:解耦但协作

ModuleLayer 不是类加载器,但它持有并管理一个专用类加载器:

  • 每个 ModuleLayer 实例关联一个 ClassLoader,该加载器仅委托给父层(parent layer)的类加载器,而非传统意义上的“双亲”
  • 模块内的类只能通过本层的 ClassLoader 加载,且仅能访问本层导出(exports)+ 父层可读(reads)的包
  • 这意味着:即使两个层都加载了同名类(如 org.slf4j.Logger),它们在 JVM 中属于不同 Class 对象,不能互相赋值或强制转换

实际影响:从“类路径战争”走向“模块边界治理”

开发者不再需要靠 URLClassLoader 手动隔离或用 Maven shade 插件重命名包。而是通过编程方式构建 layer:

  • 调用 Configuration.resolveAndBind() 构建模块配置
  • ModuleLayer.boot().defineModulesWithOneLoader() 或自定义 ClassLoader 创建新层
  • 通过 layer.modules() 获取模块集合,再用 Module::getLayer() 反查归属

这种能力让 JExten、Renew 4.0 等插件化系统得以在单 JVM 进程中安全共存多个不兼容版本的依赖,而无需 fork 进程或容器隔离。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

3913

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

2863

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

2901

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

638

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

603

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

728

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1338

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

18866

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

647

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

Java 26官方文档
Java 26官方文档

共0课时 | 0人学习