前几天搭建工程的时候,每次启动总会报这个异常:
- SLF4J: slf4j-api 1.6.x (or later) is incompatible with this binding.
- SLF4J: Your binding is version 1.5.5 or earlier.
- SLF4J: Upgrade your binding to version 1.6.x. or 2.0.x
然后紧跟着:
- 10:02:47.127:WARN::Nested in java.lang.ExceptionInInitializerError:
- java.lang.IllegalStateException: org.slf4j.LoggerFactory could not be successfully initialized. See also http:
- at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:277)
- at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:241)
- at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156)
- at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)
- at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:272)
- at org.springframework.web.context.ContextLoader.<clinit>(ContextLoader.java:149)
- at com.alibaba.citrus.webx.context.WebxContextLoaderListener.createContextLoader(WebxContextLoaderListener.java:40)
- at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:44)
- at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)
- at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
- at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
- at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
- at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
- at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
- at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
- at org.mortbay.jetty.Server.doStart(Server.java:224)
- at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
- 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. 对于间接依赖,采用最短路径优先算法,距离短的被采用, 其中“—”表示间接依赖
A—B—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.0.jar,slf4j-jdk14-1.6.0.jar,slf4j-log4j12-1.6.0-rc0.jar,slf4j-nop-1.6.0.jar,slf4j-simple-1.6.0.jar
赠送jar包:slf4j-api-1.7.30.jar; 赠送原API文档:slf4j-api-1.7.30-javadoc.jar; 赠送源代码:slf4j-api-1.7.30-sources.jar; 赠送Maven依赖信息文件:slf4j-api-1.7.30.pom; 包含翻译后的API文档:slf4j-api-...
赠送jar包:slf4j-api-1.7.26.jar; 赠送原API文档:slf4j-api-1.7.26-javadoc.jar; 赠送源代码:slf4j-api-1.7.26-sources.jar; 赠送Maven依赖信息文件:slf4j-api-1.7.26.pom; 包含翻译后的API文档:slf4j-api-...
赠送jar包:slf4j-api-1.7.16.jar; 赠送原API文档:slf4j-api-1.7.16-javadoc.jar; 赠送源代码:slf4j-api-1.7.16-sources.jar; 赠送Maven依赖信息文件:slf4j-api-1.7.16.pom; 包含翻译后的API文档:slf4j-api-...
该压缩包中包含以下内容: 1、jcl-over-slf4j-1.7.21.jar 2、jcl-over-slf4j-1.7.21-sources.jar 3、jul-to-slf4j-1.7.21.jar 4、jul-to-slf4j-1.7.21-sources.jar 5、log4j-over-slf4j-1.7.21.jar 6、log4j-over-...
赠送jar包:slf4j-api-1.7.32.jar; 赠送原API文档:slf4j-api-1.7.32-javadoc.jar; 赠送源代码:slf4j-api-1.7.32-sources.jar; 赠送Maven依赖信息文件:slf4j-api-1.7.32.pom; 包含翻译后的API文档:slf4j-api-...
1.7.21-sources.jar 7、osgi-over-slf4j-1.7.21.jar 8、osgi-over-slf4j-1.7.21-sources.jar 9、slf4j-android-1.7.21.jar 10、slf4j-android-1.7.21-sources.jar 11、slf4j-api-1.7.21.jar 12、slf4j-api-1.7.21-...
赠送jar包:slf4j-api-1.7.32.jar; 赠送原API文档:slf4j-api-1.7.32-javadoc.jar; 赠送源代码:slf4j-api-1.7.32-sources.jar; 赠送Maven依赖信息文件:slf4j-api-1.7.32.pom; 包含翻译后的API文档:slf4j-api-...
`slf4j-api-1.7.7.jar`是SLF4J API的一个特定版本,即1.7.7版本。 在Java应用程序中,使用SLF4J可以极大地提高日志处理的灵活性。SLF4J的主要优点包括: 1. **可插拔性**:通过SLF4J,开发者可以在不修改代码的...
赠送jar包:slf4j-api-1.8.0-alpha2.jar; 赠送原API文档:slf4j-api-1.8.0-alpha2-javadoc.jar; 赠送源代码:slf4j-api-1.8.0-alpha2-sources.jar; 赠送Maven依赖信息文件:slf4j-api-1.8.0-alpha2.pom; 包含...
描述中提到的"slf4j-api-1.7.30.jar"同样强调了这个版本的SLF4J API,它提供了API接口,但并不包含实际的日志实现。为了使日志工作,开发者还需要选择并引入一个具体的日志实现库,例如Logback或Log4j,通过在类路径...
压缩包内的文件名称列表中,"slf4j-api-1.5.8.jar"是SLF4J API的1.5.8版本,而"slf4j-nop-1.5.8.jar"则是SLF4J NOP实现的同版本。这两个JAR文件通常会一起使用,API JAR提供日志接口,NOP JAR作为默认的日志实现。...
赠送jar包:slf4j-api-1.7.30.jar; 赠送原API文档:slf4j-api-1.7.30-javadoc.jar; 赠送源代码:slf4j-api-1.7.30-sources.jar; 赠送Maven依赖信息文件:slf4j-api-1.7.30.pom; 包含翻译后的API文档:slf4j-api-...
slf4j-api-1.7.6.jar maven 依赖 jar包 slf4j-api-1.7.6.jar maven 依赖 jar包 slf4j-api-1.7.6.jar maven 依赖 jar包
slf4j-api-1.7.25.jar slf4j-api-1.7.25.jar slf4j-api-1.7.25.jar slf4j-api-1.7.25.jar
slf4j-api.jar slf4j-api.jar slf4j-api.jar slf4j-api.jar
12、slf4j-api-1.7.21-sources.jar 13、slf4j-ext-1.7.21.jar 14、slf4j-ext-1.7.21-sources.jar 15、slf4j-jcl-1.7.21.jar 16、slf4j-jcl-1.7.21-sources.jar 17、slf4j-jdk14-1.7.21.jar 18、slf4j-jdk14-...
标题中的"slf4j-api-1.6.1-slf4j-nop-1.6.1.rar"表明这是一个包含SLF4J API和NOP绑定的日志库的压缩包。描述中提到,解压后会得到两个JAR文件:slf4j-api-1.6.1.jar和slf4j-nop-1.6.1.jar。 **SLF4J API** 1. **...
标题中的"slf4j-log4j12-1.7.12.jar"是SLF4J的一个绑定包,它的作用是将SLF4J API与log4j日志框架连接起来。具体来说,这个版本(1.7.12)的绑定包实现了SLF4J的API,并将其桥接到log4j的实现上,使得开发者可以通过...
SLF4J的出现旨在解决Java日志库的混乱状况,为各种日志框架(如Log4j、Logback、Java Util Logging等)提供一个抽象层,使得应用程序可以在不修改代码的情况下切换日志实现。 "slf4j-api-1.7.28.jar"是SLF4J API的...