背景
- 使用淘宝diamond配置工具出现无法配置情况。
- 在分析代码、依赖和确认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
相关推荐
在websphere8.5 下部署含有CXFwebservice的war包无法正常启动,...归根结底原因不是找不到类,而是发布后war下的jar与websphere自身平台下的jar冲突了,要解决此问题就要通过在websphere下建立共享库来根除,可参考附件
tomcat与jboss冲突的日志jar包,由于在jboss中存在此日志jar包,使用jboss时,必须删除它
项目启动后访问页面,页面显示Uncaught initialization Exception created by servlet这个错误.查看日志会报找不到index()的异常。
配置日志文件时需要的jar包,配置日志文件时需要的jar包,配置日志文件时需要的jar包
关于google的tink解密用的...如上图,utils包A下的tink中未成功引入protobuf包,判断是jar包冲突,看是否是其他的jar包也引入了其他版本的protobuf包,于是,在IDEA的命令行执行命令,mvn dependency:tree ,看是否有
share-canal关于Canal中jar依赖与业务项目jar包的冲突的完美解决,并扩展接口Maven<dependency> <groupId>...
1. 使用maven工具将项目打包,生成jar包; 2. 将jar包复制到Linux系统中的某个文件夹下,此时采用xshell与xftp工具完成,如下: 3. 编写startup.sh启动程序。新建startup.sh文件,使用vim编辑如下: nohup java -...
2 提供类隔离的能力(防止jar包冲突问题) 3 日志空间隔离能力(打印日志路径分别固定) 4 SOFA 中间件的集成管理等 今天就先简单创建一个小demo,深层次的之后再说。 1.sofaBoot项目构建在springboot项目基础上,可...
它可以找到你maven工程中各种冲突(jar冲突,类冲突,日志冲突,版本冲突)。我敢打赌,我们一定知道过日志冲突。我们都知道,java的日志包多种,象log4j,logback,slf4j,通用日志,log4j-over-slf4j,slf4j-over-...
我们平时在线上或者开发中会遇到各种性能、功能等问题,在运行过程中需要查看方法入参、返回值,或者方法执行的堆栈时间,或者jar冲突时类加载来自那个jar包等问题。我们在开发过程中,可能会打印log日志、手动去...
hibernate的jar包,希望对大家有帮助 , 这个是hibernate基本包....因为最新版jar包有和课程想冲突的地方.会产生莫名其妙的bug , 所以这个jar包经本人验证是所以版本里最耐操的!希望对大家的学习能起到正面的作用.
几乎在每个jar包里都可以看到log4j的身影,在多个子工程构成项目中,slf4j相关的冲突时不时就跳出来让你不爽,那么slf4j-api、slf4j-log4j12还有log4j他们是什么关系?我把自己了解的和大家简单分享一下: slf4j:...
MESSAGE Unable to find feature.xml in directory: D:\eclipse\features\org.tigris.subversion.subclipse.mylyn_2.0.4.jar,按照日志提示的信息,我试着拷贝feature.xml过去,svn还是不出现! 于是删除...
可能你还需要考虑各个版本的兼容性,jar 包冲突的各种可行性。 那么使用 Spring Boot 之后我们需要开发一个 web 项目需要哪些操作呢? 1)登录网址 http://start.spring.io/ 选择对应的组件直接下载 2)导入项目...
可能你还需要考虑各个版本的兼容性,jar 包冲突的各种可行性。 那么使用 Spring Boot 之后我们需要开发一个 web 项目需要哪些操作呢? 1)登录网址 http://start.spring.io/ 选择对应的组件直接下载 2)导入项目...
将nginx与nginxWebUI集成到一个docker镜像中,完美的打造一个拥有图形界面的nginx运行包,不与服务器上其他程序冲突。 数据导入导出 可将全站数据导出到一个文件当中,方便程序移植与重新部署。