解决SLF4J: Class path contains multiple SLF4J bindings.

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解决问题成功!!!


参考资料:

  • [已解决] SLF4J: Class path contains multiple SLF4J bindings

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并发VS并行

参考文章 面试必考的&#xff1a;并发和并行有什么区别&#xff1f; 并发&#xff1a;一个人同时做多件事&#xff08;射击游戏队友抢装备&#xff09; 并行&#xff1a;多人同时处理同一件事&#xff08;射击游戏敌人同时射击对方&#xff09;

系统学习Python——装饰器:“私有“和“公有“属性案例-[Python不是关于控制]

分类目录&#xff1a;《系统学习Python》总目录 既然我已经用如此大的篇幅实现了Python代码的Private和Public属性声明&#xff0c;必须再次提醒&#xff0c;像这样为类添加访问控制不完全是Python的风格。实际上&#xff0c;除了充当装饰器使用的一个展示&#xff0c;大多数程…

解决ros2缺少cv_bridge包的问题——cv_bridge源码编译安装过程

安装流程 注意&#xff1a;cv_bridge 依赖boost 和 opencv 首先&#xff0c;和编译ros2功能包一样&#xff0c;先创建一个工作空间 mkdir -p cv_bridge_ws/src cd cv_bridge_ws/src然后&#xff0c;在src目录下&#xff0c;下载vision_opencv的源码,注意将-b galactic替换成…

制作 configure 文件极简教程

The magic behind configure, make, make install - How it works in Unix (thoughtbot.com) 如果要发布自己的源码&#xff0c;而自己的源码想通过configure&#xff0c;make&#xff0c;make install 编译安装&#xff0c;那么要为自己的源码建立 configure 文件&#xff0…

uniapp 安卓跳转到应用设置等页面

// #ifdef APP-PLUS const platform uni.getSystemInfoSync().platform if (platform android) {var main plus.android.runtimeMainActivity(); //获取activityvar pkName main.getPackageName();var Intent plus.android.importClass(android.content.Intent); var Set…

学习数据结构:算法的时间复杂度和空间复杂度

一、算法的复杂度 衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢&#xff0c;而空间复杂度主要衡量一个算法运行所需要的额外空间。 算法的时间复杂度 算法中的基本操作的…

SAP BAS中Fiori开发的高阶功能(storyboard, navigation, guided development, variant)

1. 前言 在之前的几篇文章中&#xff0c;我介绍了SAP BAS的一些基本功能&#xff0c;包括账户申请&#xff0c;创建工作区&#xff0c;git的使用以及如何step-by-step去创建出你的第一个Fiori项目等等。在本篇中&#xff0c;我将进一步介绍一些在开发Fiori应用程序时会用到的高…

JAVA学习笔记19(面向对象编程)

1.面向对象编程 1.1 类与对象 1.类与对象的概念 ​ *对象[属性]/[行为] ​ *语法 class cat {String name;int age; }main() {//cat1就是一个对象//创建一只猫Cat cat1 new Cat();//给猫的属性赋值cat1.name "123";cat1.age 10; }​ *类是抽象的&#xff0c;…

前端使用正则表达式进行校验

一、定义 设计思想是用一种描述性的语言定义一个规则&#xff0c;凡是符合规则的字符串&#xff0c;我们就认为它“匹配”了&#xff0c;否则&#xff0c;该字符串就是不合法的。 在 JavaScript中&#xff0c;正则表达式也是对象&#xff0c;构建正则表达式有两种方式&#x…

【可用Claude Opus模型】Claude3国内镜像站,亲测完全超越GPT-4(可用Claude Opus,官网价值20刀)

#今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用Claude 3吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像站到处都是…

如何实现一个自己的脚手架工具

如何实现一个自己的脚手架工具 创建自定义全局命令获取命令行的交互参数终端交互下载远程项目代码 创建自定义全局命令 在项目文件夹中创建一个bin文件夹&#xff0c;再去npm init 初始化项目&#xff0c;生成的package.json 里面就有一个bin的选项参数指定了命令和执行文件路…

有效的括号字符串

只想用一个栈解决&#xff0c;可惜一直解决不了&#xff0c;因为 * 的问题无法解决 看到标答用了两个栈&#xff0c;一个栈存储 ( 另一个栈储存 * 思路&#xff1a;当s[k] 为 ( 或 * 进栈 &#xff0c; 当s[k] 为 ) 时 &#xff0c; 优先左括号出栈&#xff08;因为*有…

探索LLaMA模型:架构创新与Transformer模型的进化之路

引言 在人工智能和自然语言处理领域&#xff0c;预训练语言模型的发展一直在引领着前沿科技的进步。Meta AI&#xff08;前身为Facebook&#xff09;在2023年2月推出的LLaMA&#xff08;Large Language Model Meta AI&#xff09;模型引起了广泛关注。LLaMA模型以其独特的架构…

视频批量爬虫下载工具|可导出视频分享链接|抖音视频提取软件

便捷的视频批量爬虫软件操作指南 抖音视频下载界面图解 主要功能&#xff1a; 关键词批量提取视频和单独视频提取&#xff0c;提取后下载功能。 功能解析&#xff1a; 1. 关键词批量采集视频的解析 对特定关键词进行搜索和视频提取&#xff0c;例如输入“汽车配件”&#x…

2024年洗地机综合实力排行榜:谁才是真正的洗地神器?

近年来&#xff0c;洗地机在行业里&#xff0c;它集合了扫地和拖地以及自动清洁和除菌的功能&#xff0c;备受人们的喜爱&#xff0c;尤其是平时忙于工作并没有多少时间清洁家务的用户&#xff0c;但是对于第一次接触洗地机的用户来说&#xff0c;怎么选购洗地机也是个问题&…

【P1303】 A*B Problem

A*B Problem 题目背景 高精度乘法模板题。 题目描述 给出两个非负整数&#xff0c;求它们的乘积。 输入格式 输入共两行&#xff0c;每行一个非负整数。 输出格式 输出一个非负整数表示乘积。 样例 #1 样例输入 #1 1 2样例输出 #1 2提示 每个非负整数不超过 1 0…

初识React(一)从井字棋游戏开始

写在前面&#xff1a; 磨磨唧唧了好久终于下定决心开始学react&#xff0c;刚刚接触感觉有点无从下脚...新的语法新的格式跟vue就像两种物种...倒是很好奇路由和store是怎么实现的了~v~&#xff0c;一点一点来吧&#xff01;&#xff01;&#xff01; (一)创建项目 使用vite…

【58. 最后一个单词的长度】

58. 最后一个单词的长度 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 class Solution { public: int lengthOfLastWord(string s) …

蓝桥杯算法 - DP

上一篇&#xff1a;[[蓝桥杯算法-排序、递归、全排列]] 动态规划&#xff08;dp&#xff09; dp即动态规划&#xff0c;常用于&#xff1a;数学&#xff0c;计算机科学&#xff0c;管理学&#xff0c;经济和生物信息学。 dp在生活中也很常见&#xff0c;如&#xff1a;你今天…

2023第十四届蓝桥杯C++B组题目解析

起因 24年蓝桥杯将至&#xff0c;把去年题复习一遍。emmm&#xff0c;其实是有一个很厉害的学妹说“要被圈钱杯把钱圈光了”。 现在只是初稿&#xff0c;如果有需要细写解析的可以在下面评论&#xff0c;欢迎留言。 日期统计 #include<bits/stdc.h> typedef long lon…