“模块未找到”根本原因是模块未被jvm识别:检查是否在--module-path中、jar是否存在、模块名是否与requires声明逐字符匹配(大小写敏感、无版本号),并用--show-module-resolution验证解析过程。

Java 9+ 模块化项目中报“模块未找到”,通常不是类缺失,而是 JVM 根本没识别到那个模块——它没被加载、路径不对、名字不匹配,或被静默忽略。排查要从模块是否“真实存在并被看见”开始。
确认模块是否在模块路径上且能被列出
运行以下命令,看目标模块名是否出现在输出里:
-
java --list-modules | grep -i "模块名"(如
com.example.service) - 如果没出现,说明模块没加载;再检查启动参数是否用了
--module-path(不是-cp),路径下是否存在对应 JAR 或模块目录 - 执行 java --describe-module 模块名:若返回
Module xxx not found,是路径问题;若返回no module descriptor,说明它是自动模块(JAR 名即模块名,不含.jar后缀,大小写必须完全一致)
检查 module-info.java 中 requires 的拼写与版本兼容性
requires 声明必须和提供方 module-info.java 里的 module xxx.yyy **逐字符精确匹配**:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不能带版本号(
requires com.example.util@1.2;❌) - 不能多空格或大小写错误(
requires Com.Example.Util;❌) - 若提供方模块使用了多版本 JAR,确保运行 JDK 版本 ≥ 其声明的最低版本,否则模块可能被跳过
验证模块是否被成功解析(看启动日志)
加 JVM 参数启动应用,观察模块解析过程:
- java --show-module-resolution -m your.module/your.Main
- 关注日志中是否有类似
require failed: module com.example.util not found或cannot resolve module com.example.util的提示 - 如果有,说明依赖链断在这一环;如果没有,但运行时仍报错,则可能是 exports 或 opens 缺失,而非模块未找到
区分“模块未找到”和“包不可见”
两者表现相似,但根源不同:
- “模块未找到”:
requires所指模块压根不在模块图里 → 查路径、拼写、--show-module-resolution - “包不可见”:模块加载成功,但没
exports对应包,或消费方没requires→ 用javap --module 模块名 --show-module查导出包列表 - 例如
requires java.sql;正确,但若你 import 的是javax.sql.DataSource,需确认java.sql模块是否导出javax.sql包(它确实导出)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










