背景
- 使用淘宝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时,必须删除它
标题"weblogic部署项目jar冲突解决"指出的核心问题是JAR包冲突。这是因为不同的应用服务器可能内置了不同版本的库,或者在类加载机制上有差异,导致原本在Tomcat上运行良好的应用在WebLogic上出现问题。以下是一些...
Commons Logging的目的是解决Java中的“日志混乱”问题,即不同的库可能依赖于不同的日志框架,导致应用中存在多个日志系统的冲突。通过使用Commons Logging,开发者可以在运行时指定实际的日志实现,如log4j或Java...
日志jar包则是Hibernate为了实现日志记录功能而依赖的组件,这对于调试、性能监控和问题排查至关重要。 在Java开发中,日志记录是一项基础且重要的任务,它能够帮助开发者追踪程序运行状态,定位错误源,并收集运行...
Maven是一个项目管理和综合工具,它可以帮助开发者构建、测试、部署和管理Java项目,通过依赖管理解决jar包冲突问题。 5. **commons-logging.jar**:Apache Commons Logging是Java的日志抽象层,它允许开发者选择在...
项目启动后访问页面,页面显示Uncaught initialization Exception created by servlet这个错误.查看日志会报找不到index()的异常。
在实际项目中,由于版本兼容性问题,有时会出现Spring和Hibernate之间的冲突,这主要体现在jar包版本不匹配或依赖重复。 这个名为"spring+hibernate 无冲突jar包"的压缩文件,正是为了解决这个问题而提供的。它包含...
2. **commons-logging.jar**:Apache Commons Logging 是一个轻量级的日志记录库,它为各种日志API提供了统一的接口,如log4j、java.util.logging等。DWR依赖于这个库来记录其运行时信息和错误,帮助开发者调试和...
- log4j.jar:日志处理库,提供灵活的日志记录机制,便于调试和问题追踪。 - commons-lang3.jar:Apache Commons Lang,包含各种通用的字符串、数学和日期处理函数。 - poi.jar:Apache POI,用于读写Microsoft ...
二是通过构建工具(如Maven或Gradle)管理依赖,这样可以自动下载并管理JAR包,同时避免版本冲突问题。 在实际开发中,利用接口和JAR包,开发者可以遵循一定的规范进行编程,保证了代码的模块化和可扩展性。Result...
3. **版本控制**:不同的JAR包可以代表不同版本的库,这有助于管理项目依赖和版本冲突。例如,`jboss-logging-3.3.0.Final.jar`是JBoss的日志框架的一个特定版本,确保项目使用一致的API和功能。 4. **安全**:JAR...
在本压缩包中,你可能找到了一系列用于支持 Spring MVC 开发的 jar 包。这些 jar 包包含了 Spring MVC 运行所必需的核心库和其他依赖,下面将详细解释这些知识点。 1. **Spring MVC 框架核心组件** - `spring-web...
SSH框架的整合需要一系列的jar包支持,包括但不限于Spring的核心库、Struts的Action框架、Hibernate的ORM库,以及其他支持类库,如Log4j用于日志记录,Commons-logging、Commons-lang等Apache Commons项目,以及可能...
对于现代的Maven或Gradle项目,可以直接在pom.xml或build.gradle文件中声明依赖,由构建工具自动管理这些JAR包的下载和引入,这样可以保持项目的整洁,并避免版本冲突问题。 总的来说,JavaWeb和SSH框架的JAR包集合...
描述中的"里面包含各种开发所需的包其中包含日志jar等其它所需的jar"进一步说明了这个压缩包不仅有日志相关的JAR,还包含了其他用于开发的依赖包。这些包可能包括XML解析库(如Apache Xerces或Woodstox),HTTP...