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

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

如何更优雅地对接第三方API

如何更优雅地对接第三方API 本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等。第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma