`
futeng
  • 浏览: 260478 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

日志Jar包冲突问题

    博客分类:
  • Java
阅读更多

背景

  1. 使用淘宝diamond配置工具出现无法配置情况。
  2. 在分析代码、依赖和确认diamond工作无误仍不得解后,最终由好友指点才定位了问题。

分析

异常栈如下

 

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/Workspace/Code/Maven.rep/org/slf4j/slf4j-log4j12/1.5.8/slf4j-log4j12-1.5.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/Workspace/Code/Maven.rep/ch/qos/logback/logback-classic/1.0.13/logback-classic-1.0.13.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
    at org.apache.commons.logging.impl.SLF4JLocationAwareLog.warn(SLF4JLocationAwareLog.java:185)
    at com.starit.diamond.client.impl.DefaultDiamondSubscriber.getAppName(DefaultDiamondSubscriber.java:1539)
    at com.starit.diamond.client.impl.DefaultDiamondSubscriber.<init>(DefaultDiamondSubscriber.java:177)
    at com.starit.diamond.client.impl.DefaultDiamondSubscriber.<init>(DefaultDiamondSubscriber.java:172)
    at com.starit.diamond.client.impl.DefaultDiamondSubscriber$Builder.build(DefaultDiamondSubscriber.java:168)
    at com.starit.diamond.client.impl.DiamondClientFactory.getSingletonDiamondSubscriber(DiamondClientFactory.java:41)
    at com.starit.diamond.manager.impl.DefaultDiamondManager.<init>(DefaultDiamondManager.java:140)
    at com.starit.diamond.manager.impl.DefaultDiamondManager.<init>(DefaultDiamondManager.java:122)
    at com.ustcinfo.inm.data.bolt.tedis.DiamondConfigManager.init(DiamondConfigManager.java:73)
    at com.ustcinfo.inm.data.bolt.tedis.DiamondConfigManager.getInstance(DiamondConfigManager.java:60)
    at com.ustcinfo.inm.data.bolt.Test4Diamond.main(Test4Diamond.java:20)

 

 

繁杂的异常信息,可能让长期处于Deadline边缘的程序猿媛们异常繁杂。但不翻山越岭你怎么能看到彼岸的风景。

 

我们耐下性子,定位异常发生的位置:

 

Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V

 

 

跟踪进log()这个方法

 

  public void warn(Object message) {
    logger.log(null, FQCN, LocationAwareLogger.WARN_INT, String
        .valueOf(message), null, null);
  }

 

 

这时好友怀疑是Jar包冲突。

经典场景为工程中依赖的第三方包都需要使用slf4j这个日志包,一旦这些第三方包中有个使用了较低的slf4j版本中的API,倘若slf4j没有向下兼容而直接删除了这个API,而整个工程又只能使用一个版本的slf4j,那么就会导致由于无法找到这个较低版本的API而编译无法通过。

这时我们在跟进log()这个方法定义的位置

 



 

通过箭头所指的Link with Editor定位类路径,注意上图是依据升级版本之后的图,再未升级之前版本为1.5.8,并且发现其中定义的log()方法如下:

 

public abstract void log(Marker paramMarker, String paramString1, int paramInt, String paramString2, Throwable paramThrowable);

 

仔细对比才发现,1.5.8即我们正在使用的版本中log方法只有5个参数,而diamond中依赖的日志log是6个参数了。

于是我们很自然的升级了slf4j的版本。
这个版本log有6个参数,而问题也得到了解决。

public void log(Marker marker, String fqcn, int level, String message, Object[] argArray, Throwable t);

 

总结

很多时候我们都急于寻求答案,却忘记了最重要的提醒。

请仔细聆听出错日志、异常栈的声音。

 

转载请标明作者和原文链接

ifuteng#gmail.com 2014/7/18

  • 大小: 25.7 KB
2
0
分享到:
评论
2 楼 hauzph2010 2015-10-20  
1 楼 xxl11231220 2015-09-18  
nice  感谢分享

相关推荐

    websphere下部署CXF项目jar包冲突问题解决方式

    在websphere8.5 下部署含有CXFwebservice的war包无法正常启动,...归根结底原因不是找不到类,而是发布后war下的jar与websphere自身平台下的jar冲突了,要解决此问题就要通过在websphere下建立共享库来根除,可参考附件

    tomcat与jboss冲突的日志jar包

    tomcat与jboss冲突的日志jar包,由于在jboss中存在此日志jar包,使用jboss时,必须删除它

    在was上部署项目报jar包冲突解决办法

    项目启动后访问页面,页面显示Uncaught initialization Exception created by servlet这个错误.查看日志会报找不到index()的异常。

    log4j.jar和commons-logging.jar

    配置日志文件时需要的jar包,配置日志文件时需要的jar包,配置日志文件时需要的jar包

    记一次解决maven引入jar包冲突全过程;TinkConfig注册失败

    关于google的tink解密用的...如上图,utils包A下的tink中未成功引入protobuf包,判断是jar包冲突,看是否是其他的jar包也引入了其他版本的protobuf包,于是,在IDEA的命令行执行命令,mvn dependency:tree ,看是否有

    share-canal:关于Canal中jar依赖与业务项目jar包的冲突的完美解决,并扩展接口

    share-canal关于Canal中jar依赖与业务项目jar包的冲突的完美解决,并扩展接口Maven&lt;dependency&gt; &lt;groupId&gt;...

    Linux 环境下部署 jar 包

    1. 使用maven工具将项目打包,生成jar包; 2. 将jar包复制到Linux系统中的某个文件夹下,此时采用xshell与xftp工具完成,如下: 3. 编写startup.sh启动程序。新建startup.sh文件,使用vim编辑如下: nohup java -...

    SOFABoot开源框架.rar

    2 提供类隔离的能力(防止jar包冲突问题) 3 日志空间隔离能力(打印日志路径分别固定) 4 SOFA 中间件的集成管理等 今天就先简单创建一个小demo,深层次的之后再说。 1.sofaBoot项目构建在springboot项目基础上,可...

    findConflicts:冲突的Maven插件(查找Maven项目冲突的Maven插件)

    它可以找到你maven工程中各种冲突(jar冲突,类冲突,日志冲突,版本冲突)。我敢打赌,我们一定知道过日志冲突。我们都知道,java的日志包多种,象log4j,logback,slf4j,通用日志,log4j-over-slf4j,slf4j-over-...

    阿里巴巴开源的诊断工具Arthas介绍.ppt

    我们平时在线上或者开发中会遇到各种性能、功能等问题,在运行过程中需要查看方法入参、返回值,或者方法执行的堆栈时间,或者jar冲突时类加载来自那个jar包等问题。我们在开发过程中,可能会打印log日志、手动去...

    hibernatelib.rar

    hibernate的jar包,希望对大家有帮助 , 这个是hibernate基本包....因为最新版jar包有和课程想冲突的地方.会产生莫名其妙的bug , 所以这个jar包经本人验证是所以版本里最耐操的!希望对大家的学习能起到正面的作用.

    slf4j-Logging

    几乎在每个jar包里都可以看到log4j的身影,在多个子工程构成项目中,slf4j相关的冲突时不时就跳出来让你不爽,那么slf4j-api、slf4j-log4j12还有log4j他们是什么关系?我把自己了解的和大家简单分享一下: slf4j:...

    flex eclipse插件和subclipse插件 冲突

    MESSAGE Unable to find feature.xml in directory: D:\eclipse\features\org.tigris.subversion.subclipse.mylyn_2.0.4.jar,按照日志提示的信息,我试着拷贝feature.xml过去,svn还是不出现! 于是删除...

    spring boot2.0以上版本整合mybatis+pagehelper+druid

    可能你还需要考虑各个版本的兼容性,jar 包冲突的各种可行性。 那么使用 Spring Boot 之后我们需要开发一个 web 项目需要哪些操作呢? 1)登录网址 http://start.spring.io/ 选择对应的组件直接下载 2)导入项目...

    使用MyEclipse创建Spring Boot项目demo

    可能你还需要考虑各个版本的兼容性,jar 包冲突的各种可行性。 那么使用 Spring Boot 之后我们需要开发一个 web 项目需要哪些操作呢? 1)登录网址 http://start.spring.io/ 选择对应的组件直接下载 2)导入项目...

    nginx网页配置工具nginxWebUI是一款可以使用网页来快速配置与管理nginx集群的nginx辅助工具.rar

    将nginx与nginxWebUI集成到一个docker镜像中,完美的打造一个拥有图形界面的nginx运行包,不与服务器上其他程序冲突。 数据导入导出 可将全站数据导出到一个文件当中,方便程序移植与重新部署。

Global site tag (gtag.js) - Google Analytics