核心是确保每个包名只由一个模块导出;需逐个检查module-info.java中exports语句,统一归属、禁用冗余导出,必要时重命名包或用opens限定反射访问,并在构建阶段通过jdeps和maven插件主动拦截。

Java 模块化系统中处理拆分包(Split Package)问题,核心是确保每个包名只由一个模块导出,杜绝多个模块声明同一包路径。这不是运行时调优,而是编译和构建阶段必须解决的结构性约束。
确认哪个模块在导出冲突包
通过 module-info.java 逐个检查各模块是否包含 exports com.example.utils; 这类语句。只要两个及以上模块导出相同包名,JPMS 就会在编译或启动时报错(如 error: module X reads package Y from both A and B)。可配合 jdeps --multi-release 17 --summary your-app.jar 扫描所有依赖,快速定位重复导出的包。
统一归属,禁用冗余导出
选定一个权威模块(如 common-utils)作为该包的唯一拥有者,其他模块必须:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 删除自身源码中同名包下的所有类(如
com.example.utils.Config) - 移除
module-info.java中对该包的exports声明 - 改为通过
requires common.utils;依赖该权威模块 - 若需反射访问(如 Spring 动态代理),在权威模块中用
opens com.example.utils to other.module;显式开放
物理隔离:重命名或迁移包路径
当无法立即统一归属时,优先做物理层面切割:
- 将非权威模块中的
com.example.utils改为com.example.utils.v2或com.example.bteam.utils - 批量更新所有
import语句和module-info.java中的exports/requires - 避免使用通配符导出(如
exports com.example.*;),必须显式列出每个要导出的包
构建阶段主动拦截
在 Maven 构建流程中加入防护机制,防止分裂包被意外引入:
- 启用
maven-enforcer-plugin,配置banDuplicateClasses规则 - 添加
duplicate-finder-maven-plugin扫描 JAR 包内重复的.class文件路径 - CI 流水线中增加
jdeps --check步骤,对最终组装包做模块一致性校验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










