module-info.java仅声明模块依赖与包导出,不参与标识符重命名;真正需重命名时应修改包名、同步更新exports/opens、调整框架扫描配置及业务配置。

module-info.java 本身不参与变量重命名,也不处理 Java 源码中类、方法、字段等标识符的改名问题。它只定义 Java 9+ 模块系统的模块声明、依赖关系和包导出规则。
如果你在将传统 Maven 项目迁移到 Java 平台模块系统(JPMS)过程中,遇到“变量重命名”相关困扰,大概率是混淆了两类完全不同的事情:
- ✅
module-info.java负责:模块名定义、requires哪些模块、exports哪些包、opens哪些包给反射、uses/provides服务机制等; - ❌ 它不会也不应该用于重命名类名、字段名、方法名、Maven 的
artifactId或 IDEA 中的模块名。
H3:明确目标:你真正想解决的是什么?
常见迁移场景中被误称为“变量重命名”的实际需求,通常指向以下三类问题:
模块名(module name)与 artifactId 不一致
例如:Maven 子模块目录叫user-service,pom.xml中<artifactid>user-service</artifactid>,但你在module-info.java里写了module com.example.userservice { ... }—— 这没问题,模块名可以独立于 artifactId,但需注意一致性便于维护。包名(package name)与模块名不匹配引发警告或工具限制
JDK 推荐模块名与根包名保持一致(如module com.example.user→ 应含package com.example.user;)。若你把包从com.old.user改成com.new.user,那属于源码重构,不是module-info.java的职责。-
IDEA/Maven 编译报错提示“package is empty”或“not in module graph”
这往往是因为:-
module-info.java声明了模块,但对应包路径下没有.java文件; - 或
src/main/java下包结构没同步更新; - 或 Maven 没启用模块编译(需配置
maven-compiler-plugin的release或source/target≥ 9,且加--enable-preview等参数)。
-
H3:module-info.java 的正确配置要点(实战避坑)
一个典型、可工作的 module-info.java 示例:
立即学习“Java免费学习笔记(深入)”;
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
module com.example.user {
requires java.base;
requires spring.core;
requires jakarta.annotation;
exports com.example.user.api;
exports com.example.user.dto;
opens com.example.user.config to spring.core;
uses com.example.user.spi.UserServiceFactory;
}关键说明:
-
模块名必须是合法的 Java 标识符:不能含
-、.开头、数字开头,推荐用小写字母+点号分隔(如com.example.user); -
requires的模块名:对应 JDK 内置模块(java.sql)、JAR 的自动模块名(如spring.core-6.1.0.jar→ 默认模块名spring.core),或你其他模块的显式模块名; -
exports的包必须真实存在,且路径必须与src/main/java/com/example/user/api/等物理结构严格一致; - 若使用 Spring、Hibernate 等框架,常需
opens包给框架反射访问,否则运行时报InaccessibleObjectException。
H3:配合模块化迁移的真正“重命名”操作清单
如果你确实需要调整名称(比如统一规范、解耦旧包),请按顺序执行以下步骤,而非动 module-info.java:
修改 Java 包名(如
com.old.service→com.new.service)
→ 在 IDEA 中右键包 → Refactor → Move Package,勾选 Search in comments and strings 和 Search for text occurrences,确保引用同步更新。同步更新
module-info.java中的exports/opens/uses行里的包名
→ 手动修改,或用 IDEA 全局替换(Ctrl+Shift+R),范围限定为module-info.java文件。检查所有
@ComponentScan、@MapperScan、@EntityScan等注解中的 basePackages 值
→ 例如@ComponentScan("com.old.service")必须改为"com.new.service"。更新
application.yml/application.properties中的自定义配置前缀(如app.service.timeout→app.newservice.timeout)
→ 属于业务配置层,和模块系统无关,但常被忽略。清理本地 Maven 仓库中旧
SNAPSHOT构建产物(尤其多模块间依赖)
→ 运行mvn clean install -Dmaven.test.skip=true重新安装全部模块,避免缓存导致ClassNotFoundException。
H3:验证是否成功模块化
完成迁移后,可通过以下方式确认:
- 编译阶段无
module not found、package not exported报错; - 运行
java --list-modules | grep example能看到你的模块名; - 使用
jdeps --summary target/your-app.jar查看模块依赖图; - 启动应用时日志中不再出现
Unable to make protected xxx accessible类反射警告(说明opens配置生效)。
不复杂但容易忽略


















