`
futeng
  • 浏览: 263776 次
  • 性别: 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时,必须删除它

    weblogic部署项目jar冲突解决

    标题"weblogic部署项目jar冲突解决"指出的核心问题是JAR包冲突。这是因为不同的应用服务器可能内置了不同版本的库,或者在类加载机制上有差异,导致原本在Tomcat上运行良好的应用在WebLogic上出现问题。以下是一些...

    java日志jar包

    Commons Logging的目的是解决Java中的“日志混乱”问题,即不同的库可能依赖于不同的日志框架,导致应用中存在多个日志系统的冲突。通过使用Commons Logging,开发者可以在运行时指定实际的日志实现,如log4j或Java...

    Hibernate日志jar包

    日志jar包则是Hibernate为了实现日志记录功能而依赖的组件,这对于调试、性能监控和问题排查至关重要。 在Java开发中,日志记录是一项基础且重要的任务,它能够帮助开发者追踪程序运行状态,定位错误源,并收集运行...

    myBaits所有jar包,包括log4j所需jar包,mysql所需jar包,导入后可以直接使用

    Maven是一个项目管理和综合工具,它可以帮助开发者构建、测试、部署和管理Java项目,通过依赖管理解决jar包冲突问题。 5. **commons-logging.jar**:Apache Commons Logging是Java的日志抽象层,它允许开发者选择在...

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

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

    spring+hibernate 无冲突jar包

    在实际项目中,由于版本兼容性问题,有时会出现Spring和Hibernate之间的冲突,这主要体现在jar包版本不匹配或依赖重复。 这个名为"spring+hibernate 无冲突jar包"的压缩文件,正是为了解决这个问题而提供的。它包含...

    dwr所需的jar包及配置

    2. **commons-logging.jar**:Apache Commons Logging 是一个轻量级的日志记录库,它为各种日志API提供了统一的接口,如log4j、java.util.logging等。DWR依赖于这个库来记录其运行时信息和错误,帮助开发者调试和...

    java 实用jar包 集合

    - log4j.jar:日志处理库,提供灵活的日志记录机制,便于调试和问题追踪。 - commons-lang3.jar:Apache Commons Lang,包含各种通用的字符串、数学和日期处理函数。 - poi.jar:Apache POI,用于读写Microsoft ...

    result接口jar包.rar

    二是通过构建工具(如Maven或Gradle)管理依赖,这样可以自动下载并管理JAR包,同时避免版本冲突问题。 在实际开发中,利用接口和JAR包,开发者可以遵循一定的规范进行编程,保证了代码的模块化和可扩展性。Result...

    java语言开发jar包_jar包_java_

    3. **版本控制**:不同的JAR包可以代表不同版本的库,这有助于管理项目依赖和版本冲突。例如,`jboss-logging-3.3.0.Final.jar`是JBoss的日志框架的一个特定版本,确保项目使用一致的API和功能。 4. **安全**:JAR...

    springmvc-jar包

    在本压缩包中,你可能找到了一系列用于支持 Spring MVC 开发的 jar 包。这些 jar 包包含了 Spring MVC 运行所必需的核心库和其他依赖,下面将详细解释这些知识点。 1. **Spring MVC 框架核心组件** - `spring-web...

    SSH整合jar包,包含SSH所需要的所有jar包

    SSH框架的整合需要一系列的jar包支持,包括但不限于Spring的核心库、Struts的Action框架、Hibernate的ORM库,以及其他支持类库,如Log4j用于日志记录,Commons-logging、Commons-lang等Apache Commons项目,以及可能...

    javaWeb的所有jar包及ssh的所有jar包

    对于现代的Maven或Gradle项目,可以直接在pom.xml或build.gradle文件中声明依赖,由构建工具自动管理这些JAR包的下载和引入,这样可以保持项目的整洁,并避免版本冲突问题。 总的来说,JavaWeb和SSH框架的JAR包集合...

    axis包含日志jar

    描述中的"里面包含各种开发所需的包其中包含日志jar等其它所需的jar"进一步说明了这个压缩包不仅有日志相关的JAR,还包含了其他用于开发的依赖包。这些包可能包括XML解析库(如Apache Xerces或Woodstox),HTTP...

Global site tag (gtag.js) - Google Analytics