Java模块系统启动时缺失依赖指module-path中缺少requires声明的模块,会立即抛出“Module X not found”错误;需用--module-path启动、显式requires JDK模块、java --list-modules验证、-d modules调试定位。
java 模块系统在启动阶段不会“发现缺失的变量依赖模块”——requires 指令本身不处理变量,只声明对其他模块的依赖。所谓“缺失依赖”,实际是指模块路径(module path)中缺少 requires 所声明的模块,这会在 jvm 启动时立即报错,而非运行时因变量未定义而失败。
启动时自动暴露缺失模块的典型错误
当 JVM 加载模块时,若 module-info.java 中写了:
但运行时模块路径中没有提供 com.example.utils 对应的 JAR 或模块化 JAR,JVM 会直接抛出:
java.lang.module.FindException: Module com.example.utils not found
这个错误出现在启动最前端,无需执行任何代码,也与变量、类字段或方法调用无关。
确保缺失模块被快速识别的关键操作
-
始终使用
--module-path(而非-cp)启动模块化应用:只有模块路径才能触发模块解析和 requires 校验;类路径会绕过模块系统,导致依赖静默失效 -
避免隐式依赖 java.base 以外的 JDK 模块:例如用了
java.sql中的类,就必须显式requires java.sql;,否则启动即失败 -
用
java --list-modules快速确认目标模块是否在运行时可见:检查输出中是否包含你requires的模块名 -
配合
java -d modules YourModule查看模块解析详情:启用调试日志可定位是哪个requires项找不到对应模块
注意:这不是“变量依赖”,而是模块级硬约束
Java 模块系统不跟踪字段、局部变量或方法参数的类型来源。即使某处用了 com.example.utils.Config 类型的变量,只要该类所属模块未被 requires 且不在模块路径中,JVM 就会在加载当前模块时终止,根本不会走到变量初始化那一步。
换句话说:启动阶段报的 “Module X not found”,就是 requires 声明最直接、最快速的“反馈机制”——它不是排查手段,而是系统自带的强制校验。

















