springboot项目中日志SLF4J相关的错误 multiple SLF4J bindings

2023-05-16

1. 问题描述

控制台中可以正常运行,不会报如下错误,但打成jar包会显示错误,如下:

C:\Users\1234\Desktop\eda-win\user>java -jar svc_user-1.0-SNAPSHOT.jar
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/1234/Desktop/eda-win/user/svc_user-1.0-SNAPSHOT.jar!/BOOT-INF/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/1234/Desktop/eda-win/user/svc_user-1.0-SNAPSHOT.jar!/BOOT-INF/lib/logback-classic-1.2.3.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 [org.slf4j.impl.Log4jLoggerFactory]
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.slf4j.impl.Log4jLoggerFactory loaded from jar:file:/C:/Users/1234/Desktop/eda-win/user/svc_user-1.0-SNAPSHOT.jar!/BOOT-INF/lib/slf4j-log4j12-1.7.25.jar!/). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml: org.slf4j.impl.Log4jLoggerFactory
        at org.springframework.util.Assert.instanceCheckFailed(Assert.java:637)
        at org.springframework.util.Assert.isInstanceOf(Assert.java:537)
        at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:274)
        at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:99)
        at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:191)

2. 问题分析

  1. 根据日志中SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    打开slf4j的官方解释文档
Multiple bindings were found on the class path
SLF4J API is designed to bind with one and only one underlying logging framework at a time. If more than one binding is present on the class path, SLF4J will emit a warning, listing the location of those bindings.

When multiple bindings are available on the class path, select one and only one binding you wish to use, and remove the other bindings. For example, if you have both slf4j-simple-2.0.0-alpha0.jar and slf4j-nop-2.0.0-alpha0.jar on the class path and you wish to use the nop (no-operation) binding, then remove slf4j-simple-2.0.0-alpha0.jar from the class path.

The list of locations that SLF4J provides in this warning usually provides sufficient information to identify the dependency transitively pulling in an unwanted SLF4J binding into your project. In your project's pom.xml file, exclude this SLF4J binding when declaring the unscrupulous dependency. For example, cassandra-all version 0.8.1 declares both log4j and slf4j-log4j12 as compile-time dependencies. Thus, when you include cassandra-all as a dependency in your project, the cassandra-all declaration will cause both slf4j-log4j12.jar and log4j.jar to be pulled in as dependencies. In case you do not wish to use log4j as the the SLF4J backend, you can instruct Maven to exclude these two artifacts as shown next:

简单翻译一下如下:

在类路径上找到多个绑定
SLF4J API设计为一次仅绑定一个底层日志框架。如果类路径上存在多个绑定,则SLF4J将发出警告,列出这些绑定的位置。

当类路径上有多个绑定时,请选择一个且仅选择一个您要使用的绑定,然后删除其他绑定。例如,如果您在类路径上同时拥有slf4j-simple-2.0.0-alpha0.jar和slf4j-nop-2.0.0-alpha0.jar,并且您希望使用nop(无操作)绑定,则删除类路径中的slf4j-simple-2.0.0-alpha0.jar。

SLF4J在此警告中提供的位置列表通常提供足够的信息,以标识依赖关系,该依赖关系可传递地将不需要的SLF4J绑定拉入项目。在声明不适当的依赖项时,请在项目的pom.xml文件中排除此SLF4J绑定。例如,cassandra-all 0.8.1版将log4j和slf4j-log4j12都声明为编译时依赖项。因此,当在项目中包括cassandra-all作为依赖项时,cassandra-all声明将导致slf4j-log4j12.jar和log4j.jar都作为依赖项被拉入。如果您不想将log4j用作SLF4J后端,则可以指示Maven排除这两个工件,如下所示:
  1. 问题的原因找到了,SLF4J作为一个日志接口,它每次只能绑定有且仅有一个日志实现类;我上述的这个问题即是同时绑定了logback和log4j这两种具体日志实现;
  2. logback 日志的开发者和log4j 的开发者据说是一波人,而springboot 默认日志是,较新的logback 日志。但是在以前流行的日志却是log4j ,而且很多的第三方工具都含有log4j 得引入。而我们在项目开发中,难免会引入各种各样的工具包,所以,基本上springboot 项目,如果不注意,肯定会出现这种冲突的。
  3. 最恶心的是,你在开发工具中运行或者用外置的tomcat将ROOT.jar去放入webapps文件夹下去启动,一般都不会有问题,但如果打成jar包,那么问题就出现了;

2. 问题解决

搜索查到解决方法

  1. 通过编译器中图形化的依赖来查看和排除
    在这里插入图片描述
    直接看jar实在太多,有点晕,后发现随意点击一个jar,可查看冲突的或者重复的
    在这里插入图片描述
    然后看到的似乎简化了一点儿,但还是没发现我要的
    在这里插入图片描述
    小结:到这里,我突然好像想明白了,这里冲突的没看到与日志有关的,再回头想想,冲突指的是同一个jar,却引用了多个版本的,而我们遇到的这个问题不是一个jar引用了多个版本,而是对于SLF4J这个日志框架,只能有一个实现类,而网上查找的这种方法去查看实际上是看不出来什么问题的

难道这个问题就解决不了了吗,啊啊啊?

  1. 我开始尝试用最愚蠢的方式,那就是把引用的jar,查看全部的引入坐标,看里面哪里可能引用了日志有关的,然后反复排除和打包,缩到最简,最后终于可以打出不报日志错误的包了!
    在这里插入图片描述
    在这里插入图片描述
    好在最后问题解决了,被困扰了好久!长舒一口气!

3. a little trick

在这里插入图片描述
在这里插入图片描述
原本jar是在linux服务器上运行,为了快速测试jar,我直接在windows上测试了,但如果在window中测试打开jar的时候闪退,日志信息都来不及看,这时可以考虑在bat文件后面增加"pause",这时如果日志报错会停下来的,很实用的小技巧哈!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot项目中日志SLF4J相关的错误 multiple SLF4J bindings 的相关文章

  • BigDecimalUtils BigDecimal加减乘除

    span class token keyword public span span class token keyword class span span class token class name BigDecimalUtil span
  • 关于引用的疑问

    1 变量名回顾 变量 是一段实际连续存储空间的别名 程序中通过变量 来申请并命名存储空间 通过变量 的名字可以使用存储空间 问题 xff1a 一段连续的存储空间只能有一个别名吗 xff1f 2 c 43 43 中引用 引用 可以看作一个已定
  • 在Ubuntu系统中安装字体(以安装华文行楷和方正舒体为例)

    背景 xff1a 笔者在做一个项目时 xff0c 因为项目是在windows系统中开发的 xff0c 用react写的页面 xff0c 在windows本地验证是没有问题 xff0c 但是部署到服务器 xff08 服务器系统为Ubuntu
  • Linux Shared Memory的查看与设置

    1 Linux Check Memory Usage 2 How to Check Shared Memory on Linux 3 Shared Memory Configuration 共享内存就是进程之间可以共享的一段内存 xff0c
  • java构造和生成固定的json格式(geojson为例)

    java构造和生成json格式 xff08 geojson为例 xff09 一 所要构造的json格式 二 思路和步骤 1 题外说明 本文是先解析读入的txt文件 xff0c 然后建立对应的java类来接受解析的某些值 xff0c 用了自己
  • Android 程序退出 Toast还一直显示 解决方案

    今天 xff0c 改了个bug xff1a 点击两次返回程序退出 如大家所想 xff0c 第一次点击用Toast提示 xff0c 如果在两秒内再次点击那么程序退出 在我们平时写App的时候 xff0c 习惯用Application的上下文对
  • 在word中快速查找所有图片

    选择导航窗格 点击搜索框里的小三角 选择查找图形
  • systemctl命令详解

    在linux内核启动完以后 xff0c 会执行 etc rc d rc local脚本 xff0c 最后再执行 bin login程序 xff0c 进入用户登陆界面 传统的做法 xff0c 如果要在linux里添加开机自启的命令 xff0c
  • Linux系统之下开启tomcat控制台,查看代码运行情况

    方法 xff1a 进入tomcat安装文件夹 xff0c 打开命令行 如下操作 xff1a bin gt startup sh cd logs tail f catalina out
  • 四元数姿态表示总结

    文章目录 简介用法一 xff1a 欧拉角 四元数1 Euler2Quat xff1a 2 Euler 2 Vect 2 Quat xff1a 3 Quat 2 Euler xff1a 用法二 xff1a 旋转矩阵 四元数1 Quat 2 R
  • 调用OpenCV库出现: undefined reference to `xxxxx‘ 的解决办法(使用MinGW编译器)

    记录OpenCV正确安装与调用过程 我的CMakeLists txt如下 xff1a cmake minimum required span class token punctuation span VERSION span class t
  • 解决git fatal:无法找到‘https‘的远程助手

    解决git fatal 无法找到 https 的远程助手 1 问题 今天使用git拉去代码的时候出现 fatal 无法找到 39 https 39 的远程助手错误 xff0c 如下所示 span class token function g
  • [Android Framework]Android 11系统Update-API时Lint检查问题解决和记录

    1 什么是Lint检查 Android Lint 是 ADT 16 xff08 和工具 16 xff09 中引入的一个新工具 xff0c 用于扫描 Android 项目源以查找潜在的错误 Android11之前 xff0c 我们在进行Fra
  • openEuler22.03LTS网卡配置

    VmWare完成安装openEuler xff0c 修改网卡配置文件 xff0c 重启network报错service not found xff0c 因为欧拉使用nmcli管理网络 按照centos7的经验 xff0c 修改ifcfg配置
  • 利用在线词典批量查询英语单词

    进来遇到很多英语生词 xff0c 工具书上给的解释错误百出 xff0c 而很多在线词典不但可以给出某个单词的解释 xff0c 而且有大量的示例 xff0c 因此猜想利用在线词典批量查询这些单词 怎么实现呢 xff1f 首要问题是如何自动获取
  • linux svn服务器搭建 centos 搭建svn服务器

    本文是在CentOS中采用yum安装方式 优点 xff1a 简单 xff0c 一键安装 xff0c 不用手动配置环境变量等 缺点 xff1a 安装位置为yum默认 xff0c 比如我们公司服务器上安装软件有自己的规定 xff0c 一般会采用
  • Firewall 防火墙常用命令

    Firewall开启常见端口命令 xff1a 注意 permanent意思是 永久生效 firewall cmd zone 61 public add port 61 80 tcp permanent firewall cmd zone 6
  • 第二章——keil5修改工程名字

    第一章 stm32f103建立工程 第二章 keil5修改工程名字 目录 1 修改模板文件名 2 修改工程文件名 3 删除中间文件 4 修改输出中间变量文件名 5 点击编译 xff0c 改名成功 1 修改模板文件名 把第一章建立的工程模板的
  • origin2021如何切换中文界面

    origin2021如何切换中文界面 一 直接设置Change Language二 Change Language菜单是灰色的 一 直接设置Change Language 1 单击 Help gt Change Language 2 将La
  • fbe 业务流程分析

    参考链接 xff1a https www cnblogs com bobfly1984 p 14090078 html 总结 根据 data unencrypted key和 data misc vold user keys de 0 路径

随机推荐