You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 11中ResolutionException求助:拆分包冲突如何修复?

解决Java 11模块化下Log4j拆分包冲突问题

我来帮你搞定这个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规则。

解决方案

  1. 先排查依赖树,确认是否有多余的log4j核心依赖:
    执行Maven命令:

    mvn dependency:tree
    

    找到groupId为log4j、artifactId为log4j的依赖条目。

  2. 在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)也不匹配,加剧了问题。

解决方案

  1. 升级Log4j2到2.10.0及以上版本:从2.10.0开始,Log4j团队修复了拆分包问题,将org.apache.logging.log4j包的类统一放在log4j-api中,log4j-core只导出子包(如org.apache.logging.log4j.core)。

  2. 用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>
    
  3. 简化依赖声明:引入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:17:30