Java 11中ResolutionException求助:拆分包冲突如何修复?
我来帮你搞定这个JPMS(Java Platform Module System)里的拆分包问题——这确实是Java 9+模块化系统的常见“坑”,因为JPMS严格禁止不同模块导出同一个包,不然就会抛出ResolutionException。咱们分两种情况来解决:
一、针对slf4j.log4j12与log4j的拆分包冲突
你遇到的第一个错误:
java.lang.module.ResolutionException: Modules slf4j.log4j12 and log4j export package org.apache.log4j to module kubernetes.model.common
问题根源
slf4j-log4j12是SLF4J到Log4j 1.x的桥接包,它本身已经包含了org.apache.log4j包下的部分类,但Maven可能间接引入了原生的log4j核心依赖,导致两个模块(slf4j.log4j12和log4j)都导出了同一个包,违反了JPMS规则。
解决方案
先排查依赖树,确认是否有多余的
log4j核心依赖:
执行Maven命令:mvn dependency:tree找到groupId为
log4j、artifactId为log4j的依赖条目。在
slf4j-log4j12的依赖中排除这个多余的log4j依赖:
修改你的POM:<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.26</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency>这样就只会保留
slf4j-log4j12提供的org.apache.log4j包实现,避免冲突。
二、针对log4j.core与log4j.api的拆分包冲突
第二个错误:
java.lang.module.ResolutionException: Modules log4j.core and log4j.api export package org.apache.logging.log4j to module java.annotation
问题根源
Log4j 2.7版本的模块化适配不完善——log4j-api和log4j-core两个模块都导出了org.apache.logging.log4j包,这不符合JPMS的规范。而且你的POM里SLF4J版本(1.7.6)和Log4j2版本(2.7)也不匹配,加剧了问题。
解决方案
升级Log4j2到2.10.0及以上版本:从2.10.0开始,Log4j团队修复了拆分包问题,将
org.apache.logging.log4j包的类统一放在log4j-api中,log4j-core只导出子包(如org.apache.logging.log4j.core)。用Log4j BOM统一管理版本:避免版本不匹配问题,在POM的
dependencyManagement中引入BOM:<dependencyManagement> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-bom</artifactId> <version>2.20.0</version> <!-- 推荐用最新稳定版 --> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement>简化依赖声明:引入BOM后,不需要再指定版本号,POM依赖可以简化为:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </dependency>BOM会自动帮你匹配兼容的SLF4J和Log4j2版本,彻底解决版本冲突和拆分包问题。
通用拆分包问题排查技巧
- 用
mvn dependency:tree梳理依赖关系,快速定位重复导出同一包的模块。 - 优先选择支持JPMS的依赖版本(通常是较新的稳定版),老库的模块化适配往往存在缺陷。
- 避免同时引入功能重叠的依赖(比如同时引入Log4j1和Log4j2的桥接包)。
内容的提问来源于stack exchange,提问作者BobCoder

