jdk 9目录结构大改的核心动因是模块化系统(jigsaw)落地,rt.jar和tools.jar被移除,jdk拆分为约90个.jmod文件,lib/jmods存放模块包,jre目录取消,bin统一入口,jlink支持按需生成最小化运行时。

JDK 9 起目录结构大改,核心动因是模块化系统(Jigsaw 项目)落地,而非单纯为了“整理文件夹”。结构变化是模块化在构建、分发、运行三阶段的物理映射,直接服务于可伸缩性、安全性和部署效率。
模块化倒逼目录解耦
Java 8 及之前,rt.jar 和 tools.jar 承载全部运行时类与开发工具类,所有代码“一锅炖”,无法按需裁剪。JDK 9 引入模块后,整个 JDK 自身被拆分为约 90 个 .jmod 文件(如 java.base.jmod、java.sql.jmod),每个对应一个功能明确的模块。目录结构必须反映这种粒度——lib/jmods 存放这些模块包,而不再打包成巨型 JAR。
- 原来 jre/lib 下的 rt.jar 消失,因为模块类由 平台类加载器 直接从 jmods 加载
- 原来 jre/lib/ext 目录废弃,扩展机制被模块依赖声明(requires)和自动模块机制取代
- 原来 JDK 根目录下冗余的 jre 副本被移除,因为“JRE”不再是固定产物,而是可按需组装的产物
单一入口与运行时定制能力增强
JDK 9 后,bin 目录只保留一份 java、javac 等可执行程序,不再区分 JDK/JRE 两套命令。这是因为 JVM 本身已内建模块感知能力:启动时可通过 --module-path 或 jlink 工具指定所需模块集,动态生成轻量级运行时镜像。
-
jlink 命令能基于 $JAVA_HOME/jmods 构建最小化 JRE,例如:
jlink -p $JAVA_HOME/jmods --add-modules java.base --output myjre - 这意味着“JRE”从预装目录变为按需生成的产物,传统嵌套 jre 目录失去存在必要
- conf 目录新增,用于存放 jvm.options、net.properties 等全局配置,支持容器化/云环境下的集中管理
类加载与安全模型同步重构
目录变更是类加载机制变革的外显结果。JDK 9 废弃了扩展类加载器(Extension ClassLoader),代之以 平台类加载器(Platform ClassLoader),它只负责加载 java.* 和 jdk.* 开头的模块类,并严格遵循模块的 exports 和 opens 声明。
- 原来通过 -Djava.ext.dirs 加载第三方库的方式失效,模块边界不可绕过
- lib 目录不再存放可被随意扫描的 JAR,而是分置:lib/jmods(编译期模块)、lib/modules(运行时镜像)、lib/src.zip(源码)
- 这种分离让 JDK 内部实现细节(如 sun.* 包)默认不可见,提升 API 稳定性与安全性
结构变化不是表面调整,而是 Java 运行时从“全量交付”转向“按需组装”的关键一步。它为微服务、容器、嵌入式等场景提供了真正可行的瘦身路径,也为后续版本(如 JEP 392 的 JPackage)打下基础。











