解决java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound

解决​​java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path​​

在使用Java编程的过程中,我们常常会遇到各种各样的错误和异常。其中一个常见的问题是在依赖库中出现了相互冲突的情况,比如在使用日志框架时可能会出现​​java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path​​的异常。这个异常是由于在项目的依赖中同时存在了​​log4j-over-slf4j.jar​​和​​slf4j-log4j12.jar​​这两个不兼容的库引起的。

问题产生的原因

这个问题的根本原因是存在两个不同的日志框架冲突,分别是​​Log4j​​和​​Slf4j​​。​​Log4j​​是一个Java日志框架,而​​Slf4j​​(Simple Logging Facade for Java)是一个简单的日志门面,它提供了一个统一的API,可以用于不同的日志框架。在某些情况下,我们可能需要使用​​Log4j​​作为日志框架,但依赖库中同时引入了​​Log4j​​和​​Slf4j​​,导致冲突。

解决方法

解决这个问题的方法很简单,我们只需要移除或者排除其中一个库的依赖即可。下面是两种解决方法:

方法一:移除​​Slf4j​​的依赖

如果你已经决定使用​​Log4j​​作为日志框架,可以直接移除或者排除​​Slf4j​​的依赖。具体方法取决于你的项目构建工具,比如Maven或Gradle。 使用Maven的排除依赖方法: 在你的​​pom.xml​​文件中,找到引入​​Slf4j​​的依赖项,添加排除依赖配置:

xml 复制代码
xmlCopy code<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version><!-- 版本号 --></version>
    <exclusions>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

使用Gradle的排除依赖方法: 在你的​​build.gradle​​文件中,找到引入​​Slf4j​​的依赖项,添加排除依赖配置:

javascript 复制代码
groovyCopy codedependencies {
    implementation('org.slf4j:slf4j-log4j12:版本号') {
        exclude group: 'log4j', module: 'log4j'
    }
}

方法二:移除​​Log4j​​的依赖

如果你已经决定使用​​Slf4j​​作为日志框架,可以移除或者排除​​Log4j​​的依赖。 使用Maven的排除依赖方法: 在你的​​pom.xml​​文件中,找到引入​​Log4j​​的依赖项,添加排除依赖配置:

xml 复制代码
xmlCopy code<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version><!-- 版本号 --></version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

使用Gradle的排除依赖方法: 在你的​​build.gradle​​文件中,找到引入​​Log4j​​的依赖项,添加排除依赖配置:

javascript 复制代码
groovyCopy codedependencies {
    implementation('org.apache.logging.log4j:log4j-core:版本号') {
        exclude group: 'org.slf4j', module: 'slf4j-api'
    }
}

结论

在使用Java开发过程中,如果遇到​​java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path​​异常,可以考虑检查项目的依赖中是否存在​​Log4j​​和​​Slf4j​​这两个库的冲突。通过移除或排除其中一个库的依赖,可以解决这个问题。在选择移除或排除哪个库的依赖时,需要根据自己的项目需求和使用习惯来决定。希望本文对你解决这个问题有所帮助。

​log4j-over-slf4j.jar​​​和​​slf4j-log4j12.jar​​​是在使用​​SLF4J​​​(Simple Logging Facade for Java)和​​Log4j​​作为日志框架时常见的两个jar包。

  1. ​slf4j-log4j12.jar​​SLF4J​​Log4j 1.x​的绑定实现。它实现了​SLF4J​的接口,并将日志消息转发给​Log4j​进行处理。通过使用​slf4j-log4j12.jar​,我们可以在使用​SLF4J​的代码中直接使用​Log4j​作为实际的日志框架。
  2. ​log4j-over-slf4j.jar​则是反过来的,它是​SLF4J​​Log4j​的一个桥接实现。它的作用是将原本使用​Log4j​的代码中的日志调用转发到​SLF4J​,然后再由​SLF4J​根据实际的配置绑定到具体的日志实现(比如​Logback​)上。 这两个jar包的存在是为了解决在使用​SLF4J​​Log4j​组合时可能产生的冲突问题。​SLF4J​是一个轻量级的日志门面,它提供了统一的接口,可以方便地切换底层的日志实现。而​Log4j​是一个功能强大的日志框架,拥有丰富的配置选项和灵活的日志输出方式。 当我们使用​SLF4J​​Log4j​组合时,可能会出现两个日志框架同时存在于项目中的情况。这样就会导致两个框架之间的冲突,引发一些问题,比如类冲突,导致​java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path​异常。 为了解决这个问题,我们可以选择使用​slf4j-log4j12.jar​来绑定​Log4j 1.x​,或者使用​log4j-over-slf4j.jar​来桥接其他日志实现,如​Logback​。通过选择适合的jar包,可以使我们的代码在使用统一的​SLF4J​接口的同时,能够正常地使用底层的日志实现。
相关推荐
小筱在线3 分钟前
在SpringCloud中实现服务间链路追踪
后端·spring·spring cloud
计算机学姐17 分钟前
基于SpringBoot+Vue的高校门禁管理系统
java·vue.js·spring boot·后端·spring·intellij-idea·mybatis
大熊程序猿21 分钟前
go 安装依赖超时
开发语言·后端·golang
计算机学姐1 小时前
基于SpringBoot+Vue的宠物医院管理系统
java·vue.js·spring boot·后端·mysql·intellij-idea·mybatis
JosieBook2 小时前
【.NET全栈】ASP.NET实战—基于ASP.NET的求职系统设计与实现
后端·asp.net·.net
customer082 小时前
【开源免费】基于SpringBoot+Vue.JS教师工作量管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
AskHarries2 小时前
Spring Boot集成LangChain来实现Rag应用
java·spring boot·后端
黄俊懿2 小时前
【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器
java·分布式·后端·spring cloud·微服务·架构·手写源码
Xua30553 小时前
浅谈Spring Cloud:OpenFeign
后端·spring·spring cloud
蓝染-惣右介4 小时前
【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(二)
java·前端·后端·vue·springboot