Java模块化“找不到模块”异常本质是模块依赖关系断裂,核心在于module-info.java声明与目标模块真实名称是否完全匹配,需依次验证模块化状态、requires拼写、模块路径配置及反射/服务访问权限。

Java 模块化项目中“找不到模块”异常,本质不是类缺失,而是模块系统在编译或启动阶段拒绝建立依赖关系。核心定位点只有一个:module-info.java 的声明是否与目标模块的真实身份完全匹配。只要这层关系断了,就会报错如 error: module not found: xxx 或运行时报 java.lang.module.ResolutionException。
第一步:确认第三方库是否真正“可模块化访问”
不是所有 JAR 都能直接 requires——关键看它有没有被 JVM 识别为合法模块:
- 已模块化的库(如
gson-2.10.1.jar):自带META-INF/MANIFEST.MF或module-info.class,模块名通常就是com.google.gson;直接写requires com.google.gson; - 传统 JAR(如
commons-lang3-3.12.0.jar):无模块描述,JVM 自动转为“自动模块”,模块名按规则推断——去掉版本号和.jar,连字符变点号,即org.apache.commons.lang3→org.apache.commons.lang3(不变),slf4j-simple-1.7.36.jar→slf4j.simple - 不确定模块名?用命令验证:
jdeps --list-deps your-app.jar(查看依赖列表)
或解压 JAR,检查META-INF/MANIFEST.MF中是否有Automatic-Module-Name属性
第二步:检查 module-info.java 的 requires 是否写对
常见拼写/大小写/符号错误会直接导致“模块未找到”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 模块名必须全小写,不含下划线或大写字母(如
requires org.junit.jupiter.api;✅,不能写成requires junit-jupiter-api;❌) - 不要加版本号、不要带
.jar后缀,也不要写包路径(如requires com.example.util;是错的,那是包名,不是模块名) - 若用 Maven 管理,确保该依赖已正确声明为
compile范围,且被实际加入模块路径(module path),而非旧式 classpath
第三步:验证模块路径(--module-path)是否生效
即使 module-info 写对了,如果 JVM 启动时没把第三方库放对位置,依然报错:
立即学习“Java免费学习笔记(深入)”;
- 编译时:用
javac --module-path lib/ -d out/ module-info.java src/**/*.java,确保lib/下包含目标 JAR - 运行时:用
java --module-path lib/:out/ --module myapp/com.example.Main,路径之间用:(Windows)或:(macOS/Linux)分隔 - IDEA 中:检查 Run Configuration → Use classpath of module → 改为 Use module path,并确认 Libraries 已添加到 Modules → Dependencies 且 Scope 是 Compile
第四步:处理反射或服务加载等进阶场景
有些“找不到”不是模块不存在,而是访问权限被拦住:
- 用 Gson/Jackson 反序列化你自己的类?你的模块需
opens mypackage;(让 Gson 读私有字段) - 用 Spring Boot 扫描你的组件?可能还需
opens mypackage to spring.core; - 调用
ServiceLoader.load(MyPlugin.class)?必须在 module-info.java 中声明uses MyPlugin; - 多个模块提供同一服务?要配合
provides ... with ...;显式声明实现

















