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

相关文章

Redis中的数据一致性问题以及解决方案

《Redis中的数据一致性问题以及解决方案》:本文主要介绍Redis中的数据一致性问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Redis 数据一致性问题的产生1. 单节点环境的一致性问题2. 网络分区和宕机3. 并发写入导致的脏数据4. 持

一文详解如何在Vue3中封装API请求

《一文详解如何在Vue3中封装API请求》在现代前端开发中,API请求是不可避免的一部分,尤其是与后端交互时,下面我们来看看如何在Vue3项目中封装API请求,让你在实现功能时更加高效吧... 目录为什么要封装API请求1. vue 3项目结构2. 安装axIOS3. 创建API封装模块4. 封装API请求

Java版本不兼容问题详细解决方案步骤

《Java版本不兼容问题详细解决方案步骤》:本文主要介绍Java版本不兼容问题解决的相关资料,详细分析了问题原因,并提供了解决方案,包括统一JDK版本、修改项目配置和清理旧版本残留等步骤,需要的朋... 目录错误原因分析解决方案步骤第一步:统一 JDK 版本第二步:修改项目配置第三步:清理旧版本残留兼容性对

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

MySQL主从同步延迟问题的全面解决方案

《MySQL主从同步延迟问题的全面解决方案》MySQL主从同步延迟是分布式数据库系统中的常见问题,会导致从库读取到过期数据,影响业务一致性,下面我将深入分析延迟原因并提供多层次的解决方案,需要的朋友可... 目录一、同步延迟原因深度分析1.1 主从复制原理回顾1.2 延迟产生的关键环节二、实时监控与诊断方案

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持