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文件中比较靠前的位置显示声明一个高版本,或者排除某个低版本依赖;

### 回答1: 您好!您可以通过以下步骤下载slf4j-api-1.7.30.jar: 1. 打开https://www.slf4j.org/download.html网站。 2. 在“SLF4J 1.7.30”下面的“Download”栏中,单击“slf4j-api-1.7.30.zip”链接。 3. 下载完成后,解压缩zip文件。 4. 在解压缩的文件夹中,您可以找到“slf4j-api-1.7.30.jar”文件,将其复制到您的项目中即可。 希望这可以帮助您! ### 回答2: 要下载slf4j-api-1.7.30.jar,可以按照以下步骤进行: 1. 打开您常用的浏览器,如谷歌浏览器或火狐浏览器等。 2. 在搜索引擎中输入"slf4j-api-1.7.30.jar下载",然后按下Enter键进行搜索。 3. 浏览器会列出相关的搜索结果页面,您可以选择其中一个可靠的网站,如官方网站或Maven仓库等。 4. 进入您选择的网站后,在网站的搜索框中输入"slf4j-api-1.7.30.jar",然后点击搜索按钮或按下Enter键。 5. 网站会列出与您搜索关键词相关的文件。找到"slf4j-api-1.7.30.jar"文件并点击下载链接。 6. 系统会提示您选择文件的保存位置。您可以选择将其保存在您电脑中合适的文件夹中,以便于稍后安装或使用。 7. 等待文件下载完成。下载速度取决于您的网络连接速度。 8. 下载完成后,您可以在指定的文件夹中找到"slf4j-api-1.7.30.jar"文件。 请注意,确保下载文件的来源可靠和安全,并且与您的操作系统兼容。 ### 回答3: slf4j-api-1.7.30.jar 是一个用于Java应用程序的日志框架的jar文件。它是Simple Logging Facade for Java (SLF4J)的API模块,用于将不同的日志实现与应用程序代码分离。通过使用SLF4J,可以在应用程序中编写一致的日志记录代码,而不依赖于特定的日志实现。 下载 slf4j-api-1.7.30.jar 可以通过多种途径实现。其中一种方法是在SLF4J的官方网站上下载。访问官方网站后,找到下载页并选择相应的版本进行下载。另外,也可以通过Maven等构建工具进行下载。在项目的pom.xml文件中指定 slf4j-api 的依赖,构建工具会自动下载并管理相关的jar文件。 下载后,将 slf4j-api-1.7.30.jar 添加到项目的构建路径中。这样,在编写日志记录代码时,就可以使用SLF4J提供的API进行日志记录,而不需要关注具体的日志实现。SLF4J支持多种日志实现,如Logback、Log4j等,可以根据需要选择合适的实现,并将其相应的jar文件添加到项目中。 总结来说,下载 slf4j-api-1.7.30.jar 是为了在Java应用程序中使用SLF4J日志框架。下载后,将其添加到项目的构建路径中,然后可以使用SLF4JAPI进行日志记录,而无需直接依赖于特定的日志实现。这样可以方便地对日志框架进行切换和管理,提高代码的可维护性和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值