解决SLF4J: Class path contains multiple SLF4J bindings.

本文讲述了SpringBoot项目中因引入多个依赖导致SLF4J类库冲突的问题,解释了冲突原因,涉及资源浪费、配置复杂性和潜在兼容性问题,并提供了在IDEA中查找冲突依赖并排除SLF4J绑定的解决方案。
摘要由CSDN通过智能技术生成

JDK版本:jdk17
IDEA版本:IntelliJ IDEA 2022.1.3
SpringBoot 版本:v2.5.7
maven版本:3.6.3



在这里插入图片描述


问题描述:

当SpringBoot项目中引入多个依赖,如果多个依赖中都引入了SLF4J类库,启动项目时就会报以下错误

如下图所示

在这里插入图片描述

完整报错信息如下

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/ins/apache-maven-3.6.3/localReposity/ch/qos/logback/logback-classic/1.2.7/logback-classic-1.2.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/ins/apache-maven-3.6.3/localReposity/org/slf4j/slf4j-simple/1.7.32/slf4j-simple-1.7.32.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

原因分析:

当前项目的依赖中类路径中存在多个绑定的SLF4J类库,产生冲突了

那为什么SpringBoot项目不允许存在多个绑定SLF4J类库的依赖?

Spring Boot项目中不建议存在多个SLF4J绑定类库的依赖。虽然在技术上,一个项目可以包含多个SLF4J绑定(即实现了SLF4J API的具体日志实现库,如Logback、Log4j、SLF4J Simple等),但这样做会导致以下问题:

  1. 冲突与不确定性

    当类路径中存在多个SLF4J绑定时,SLF4J会在启动时警告存在多个绑定,并会选择其中一个绑定进行初始化。这种选择通常是不确定的,取决于类加载器的加载顺序。由于不同的日志实现可能存在差异,使用非预期的日志系统可能会导致日志输出不符合预期,甚至丢失日志信息。

  2. 资源浪费

    多个绑定意味着类路径中加载了多个日志实现库,这不仅增加了应用程序的内存占用,还可能导致CPU资源浪费,因为未被选中的日志库仍会被加载但并未实际使用。

  3. 配置复杂性

    如果项目中同时存在多个日志实现,配置管理会变得复杂。您可能需要为每个日志实现分别配置,而这可能导致配置冲突或难以预期的行为。此外,当需要切换日志实现时,需要更新多个配置文件,增加了维护负担。

  4. 潜在的兼容性问题

    不同的日志实现可能存在细微的API差异或行为差异。同时使用多个绑定可能导致某些特性无法正常工作,或者在特定场景下产生难以诊断的问题。

所以,为了避免上述问题,Spring Boot项目通常遵循以下原则:

  • 明确指定一个日志实现:在项目中只保留一个SLF4J绑定,通常是Logback,因为它与Spring Boot有着良好的集成,且默认由Spring Boot Starter Logging提供。如果您有特定需求需要使用其他日志实现(如Log4j2),则应确保排除其他所有SLF4J绑定。

  • 清理类路径
    定期检查依赖管理工具(如Maven或Gradle)生成的依赖报告,确保没有意外引入的SLF4J绑定。如果有,通过排除依赖或调整依赖版本来移除多余的绑定。

  • 遵循最佳实践
    遵循Spring Boot官方文档推荐的日志配置方法,确保所有日志配置集中且一致。避免在应用代码中硬编码日志实现相关的配置或API调用。

因此,尽管Spring Boot项目在技术上可以包含多个SLF4J绑定类库,但从最佳实践和避免潜在问题的角度出发,应当确保项目中只有一个选定的日志实现库与SLF4J绑定。


解决方案:

  1. 寻找项目中到底是哪些依赖都绑定了SLF4J类库

在IDEA底下 终端 中使用 mvn dependency:tree 命令列出当前项目所引入的依赖

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
注意

上述mvn命令的前提是你的电脑配了mvn系统环境变量

如果想要更详细的探究依赖引入情况,可以参考如下步骤

①将鼠标光标置于当前项目的pop.xml文件中,右击按照以下步骤打开项目依赖图

在这里插入图片描述
在这里插入图片描述

Ctrl + F 打开图元素选框,选择包含SLF4J的图元素,它会自动定位于所选定的图元素

在这里插入图片描述
在这里插入图片描述
注意

你可以根据带箭头的直线前后详细低地查看各个类库的依赖引入关系

  1. 通过上述命令得知,spring-boot-starter-test类库与dashscope-sdk-java类库都绑定了SLF4J类库,任选其一,在pop.xml中移除所绑定的SLF4J类库即可(我这里是在dashscope-sdk-java里移除了SLF4J的绑定)

代码示例如下

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dashscope-sdk-java</artifactId>
            <version>2.10.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-simple</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  1. 刷新Maven变更

在这里插入图片描述
4. 重启项目,SLF4J报错信息消失

在这里插入图片描述
至此,debug解决问题成功!!!


参考资料:


  • 33
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在Linux上,如果遇到`SLF4J: Class path contains multiple SLF4J bindings`这样的错误,通常意味着你的项目中引入了多个日志框架,如logback和slf4j本身的jar包,它们试图竞争作为默认的日志管理器。解决这个问题需要确保只有一个SLF4J绑定被有效加载。这里有一些步骤可以帮助你: 1. **查看依赖**:首先,检查你的Maven或Gradle构建文件,确认是否有多个SLF4J相关的依赖项。移除多余的、未使用的库。 ```bash mvn dependency:tree | grep slf4j ``` 或者 ```bash gradle dependencies | grep slf4j ``` 2. **保留一个版本**:选择一个你喜欢的日志框架,例如slf4j本身或logback,并将其作为项目的主要日志库。删除其他版本。 3. **排除冲突**:在build.gradle或pom.xml文件中,对slf4j的依赖添加exclusions,明确指定排除其他冲突的版本。 例如,在Gradle中: ```groovy dependencies { implementation 'org.slf4j:slf4j-api:1.x.y' implementation 'org.slf4j:slf4j-log4j12:1.x.y' // 或者 logback-classic implementation 'ch.qos.logback:logback-core:1.x.y' implementation 'ch.qos.logback:logback-classic:1.x.y' exclude group: 'org.slf4j', module: 'slf4j-log4j12' // 或者exclude org.slf4j:slf4j-jdk14 } ``` 4. **配置桥接器**:如果你同时使用slf4j-api和logback-classic,可能需要在应用启动时添加一个BridgeHandler,确保两者能正常协同工作。比如在Spring Boot中,可以这样做: ```java import org.slf4j.bridge.SLF4JBridgeHandler; SLF4JBridgeHandler.removeHandlersForRootLogger(); SLF4JBridgeHandler.install(); ``` 5. **重启项目**:最后,清理并重新构建项目,然后重启应用程序以加载新的配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上少年,且听这风吟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值