slf4j-api 1.6.x (or later) is incompatible with this binding.解决方案及原理

2024-06-22 03:18

本文主要是介绍slf4j-api 1.6.x (or later) is incompatible with this binding.解决方案及原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前几天搭建工程的时候,每次启动总会报这个异常:
[java]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. SLF4J: slf4j-api 1.6.x (or later) is incompatible with this binding.  
  2. SLF4J: Your binding is version 1.5.5 or earlier.  
  3. SLF4J: Upgrade your binding to version 1.6.x. or 2.0.x  


然后紧跟着:
[java]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. 10:02:47.127:WARN::Nested in java.lang.ExceptionInInitializerError:  
  2. java.lang.IllegalStateException: org.slf4j.LoggerFactory could not be successfully initialized. See also http://www.slf4j.org/codes.html#unsuccessfulInit  
  3.     at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:277)  
  4.     at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:241)  
  5.     at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156)  
  6.     at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)  
  7.     at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:272)  
  8.     at org.springframework.web.context.ContextLoader.<clinit>(ContextLoader.java:149)  
  9.     at com.alibaba.citrus.webx.context.WebxContextLoaderListener.createContextLoader(WebxContextLoaderListener.java:40)  
  10.     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:44)  
  11.     at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)  
  12.     at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)  
  13.     at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)  
  14.     at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)  
  15.     at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)  
  16.     at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)  
  17.     at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)  
  18.     at org.mortbay.jetty.Server.doStart(Server.java:224)  
  19.     at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)  
  20.     at runjettyrun.Bootstrap.main(Bootstrap.java:259)  



从错误提示来看,是版本不兼容的问题(废话)。

  首先估计是slf4j-api的版本,在每个子工程下面不一样,也许在子工程1里面是1.6.1,在子工程2里面是1.5.6,打包运行时候,出现了版本冲突导致的。

eclipse工程下——打开pom文件——选择dependecy Hierarchy ,就可以查看每个jar包以及他们之间的依赖关系。(本质上执行mvn dependency:tree命令是一样的)

    查看某个工程的Pom文件,发现其中一个的Pom文件依赖关系是这样的:


其中,当我们在右上角搜索slf的时候,右边显示的是所有的jar包,橙色被选中的是匹配的同名Jar包,我们可以看到有slf4j-api:1.5.6,slf4j-log4j12:1.4.3以及jcl-over-slf4j:1.5.6;左边是工程中哪些其他Jar包间接依赖了slf4j-*,其中compile表示该版本为选中的编译版本,omitted for confict with ××× 表示因为存在×××版本,当前版本被忽略。

因此我们可以看到,slf4j-api编译版本为1.5.6,slf4j-log12编译版本为1.4.3,jcl-over-slf4j编译版本为1.5.6。如果工程中所有依赖的slf4j-api版本都是1.5.6也是允许的,但是考虑到工程整体结构,以及高版本通常兼容低版本,最重要的是只有这个一个子工程用了低版本,当然要升级到1.6.1了!

在此再罗嗦一下,简单说一下Mvn工程Pom文件中dependency之间各jar包版本的依赖关系:

A. pom文件的依赖按声明顺序上到下读取,即先声明的优先

    例如:pom文件中依赖的声明顺序由上向下为: 

dependency:A(1.0.1)

dependency:A(1.0.2)

那么系统依赖肯定是依赖A1.0.1,因为该依赖最先被声明,后面的被Omitted(忽略)

B. 对于间接依赖,采用最短路径优先算法,距离短的被采用, 其中“—”表示间接依赖

AB—C—D(1.0.0)

F—E—D(1.0.1)

其中A间接依赖B,B又间接依赖C,C又间接依赖D,此时路径距离为3;另一个依赖:F间接依赖E,E间接依赖D,此时路径为2;

根据最短路径优先原则,会依赖F-E-D(1.0.1)中的D(1.0.1)版本。


C. 对于间接依赖路径长度相同的,谁先声明选谁,和A的规则是一样的

A—B—C—D(1.0.0)

F—E—K—D(1.0.1)

路径长度相同,先声明者优先选取,肯定选取D(1.0.0)


综上:

      如果我们想要将slf4j-api升级到1.6.1,最直接的办法就是在tair-mc-client声明之前直接声明一个slf4j-api:1.6.1的版本,或者排除tair-mc-client——tair-cient——slf4j-api:1.5.6的依赖,从而间接依赖tair-mc-client——tair-client——echache——slf4j-api:1.6.1。为了直观一点,我们选取直接声明一个slf4j-api:1.6.1版本的依赖。同时为了保证slf4j-api,slf4j-log4j12版本一致性,直接引入slf4j-log4j12:1.6.1版本,因为slf4j-log4j12:1.6.1间接依赖slf4j:1.6.1,并将其声明在文件最顶端,问题解决


对于排除同个jar包多个版本的冲突问题:

首先是搞清楚各个Jar包之间的依赖关系:对于用eclipse工具的mvn工程,可以直接查看pom文件中的dependency Hierarchy 或者用命令 mvn dependency:tree 将依赖关系展现出来,这样就知道哪个间接的版本有问题;

        然后选择合适的版本,剔除不想要的版本:通常是高版本优先,可以在Pom文件中比较靠前的位置显示声明一个高版本,或者排除某个低版本依赖;

这篇关于slf4j-api 1.6.x (or later) is incompatible with this binding.解决方案及原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083134

相关文章

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

Vuex Actions多参数传递的解决方案

《VuexActions多参数传递的解决方案》在Vuex中,actions的设计默认只支持单个参数传递,这有时会限制我们的使用场景,下面我将详细介绍几种处理多参数传递的解决方案,从基础到高级,... 目录一、对象封装法(推荐)二、参数解构法三、柯里化函数法四、Payload 工厂函数五、TypeScript

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带