本文副标题:解决 NoSuchMethodError 异常
java.lang.NoSuchMethodError: org.slf4j.MDC.getCopyOfContextMap()Ljava/util/Map
-------------------------------------------------------
今天在一台机器上配置完 spring-activemq 后,可以无障碍的运行测试代码。但是,完全相同的代码提交后在另一台机器死活跑不通。主要的错误堆栈信息如下
Caused by: java.lang.NoSuchMethodError: org.slf4j.MDC.getCopyOfContextMap()Ljava/util/Map;
at org.apache.activemq.util.MDCHelper.getCopyOfContextMap(MDCHelper.java:30)
at org.apache.activemq.thread.PooledTaskRunner.<init>(PooledTaskRunner.java:42)
Java.lang.NoSuchMethodError 的 javadoc 注释如下:
/**
* Thrown if an application tries to call a specified method of a
* class (either static or instance), and that class no longer has a
* definition of that method.
* <p>
* Normally, this error is caught by the compiler; this error can
* only occur at run time if the definition of a class has
* incompatibly changed.
*
* @author unascribed
* @version %I%, %G%
* @since JDK1.0
*/
通过注释( this error can only occur at run time if the definition of a class has incompatibly changed. )可以初步推断是因为版本不兼容导致的。
NOTE: 错误信息里方法名后的 Ljava/util/Map 代表的是该方法的返回值类型。
再结合所缺失方法(org.slf4j.MDC.getCopyOfContextMap)的 Javadoc:
/**
* Return a copy of the current thread's context map, with keys and values of
* type String. Returned value may be null.
*
* @return A copy of the current thread's context map. May be null.
* @since 1.5.1
*/
public static Map getCopyOfContextMap() {
从 @since 1.5.1 可以看出,该方法需要高于1.5.1 的 slf4j 版本。
在工程 pom 下查看所依赖的 slf4j 版本发现所使用的是 1.5.11,从版本看是没有问题的。那么错误究竟从哪儿来的?从同事那里知道之前碰到过这个问题,当时解决的方法是将 JBoss 的版本从5.0.0换到了5.1.0。试了一下,用这个办法确实可以解决问题。但是,我并不满足于只是解决了问题,如果只是这样,那么前面的分析都白费了。
我想验证的是:Jboss 5.0.0 依赖的 sfl4j 版本是1.5.1之前的,而jboss 5.1.0 依赖的是slf4j 1.5.1之后的某个版本。经过一翻对比,确实证实了这个猜测。以下来自 jboss 根目录下的 jar-versions.xml :
jboss 5.0.0 用的 slf4j 是 1.5.0
<jar name="slf4j-api.jar" specVersion="5.0.0.GA" specVendor="JBoss (http://www.jboss.org/)" specTitle="JBoss" implVersion="1.5.0" implVendor="JBoss Inc." implTitle="slf4j-api" implVendorID="http://www.jboss.org/" implURL="http://www.jboss.org/" sealed="false" md5Digest="d0841573796aa6b6dcf311e7e8f07a95"/>
jboss 5.1.0 用的 slf4j 是 1.5.6
<jar name="slf4j-api.jar" specVersion="5.1.0.GA" specVendor="JBoss (http://www.jboss.org/)" specTitle="JBoss" implVersion="1.5.6" implVendor="JBoss Inc." implTitle="slf4j-api" implVendorID="http://www.jboss.org/" implURL="http://www.jboss.org/" sealed="false" md5Digest="63720afbf77db737e305c85388302650"/>
通过这次的分析也可以看出,工程中依赖的 jar 包如果跟 jboss 自身依赖的 jar 版本冲突,会优先使用 jboss 的 jar。
最后,这个案例带给我的最大收获是通过错误堆栈信息以及源码可以更快的分析出错误的来源。
分享到:
相关推荐
了解以上知识点后,你可以深入研究易语言汇编动态堆栈调用的源码,分析其工作原理,从而提升你的编程技能,特别是在底层系统编程和性能优化方面。同时,"SanYe"可能是一个开发者或社区的名字,这暗示了该资源可能...
### OpenSSL源码分析知识点梳理 #### 一、基础知识 **1.1 对称算法** - **定义**: 对称加密算法是指加密和解密使用相同密钥的加密算法。 - **常见算法**: 包括DES(Data Encryption Standard)、AES(Advanced ...
通过Logcat,我们可以看到程序运行过程中的错误信息、警告和调试信息。学会识别常见的错误代码和异常,如`NullPointerException`, `IndexOutOfBoundsException`等,对问题定位大有裨益。此外,还可以结合堆栈跟踪...
通过阅读和理解这段代码,开发者可以识别出错误的来源,例如空指针异常(NullPointerException)、数组越界(ArrayIndexOutOfBoundsException)或其他逻辑错误。源码分析还包括对整个软件架构和模块间的交互进行审查...
在遇到崩溃或异常时,Logcat会显示错误堆栈信息,这对于我们理解异常原因极其重要。 在实际应用中,我们还需要学会使用`adb logcat`命令来查看设备上的日志。通过过滤特定tag或级别,我们可以快速找到与我们的应用...
它记录了程序运行过程中的事件、错误和信息,帮助开发者了解程序状态,定位问题。本教程将深入探讨如何有效地分析Android应用源码中的Log,以及提供实用的例子来帮助你提升Log分析能力。 首先,理解Logcat是关键。...
当程序出现错误时,runtime需要知道详细的堆栈信息,如包、源文件、函数或方法以及行号。pcnlntab不仅包含了这些位置信息,还存储了关于栈帧管理和垃圾回收所需的数据,例如栈变量的生命周期信息。 在逆向分析过程...
4. **调用堆栈**:显示当前函数调用的上下文,便于理解函数之间的调用关系和查找错误来源。 5. **异常处理**:当发生错误时,调试器能够捕获异常,提供错误信息,并在出错位置停止,便于分析错误原因。 6. **性能...
当错误发生时,sourcemap可以帮助我们把运行时的错误堆栈转换回源码位置,使得开发者可以准确地定位到问题所在。 Stacktrace是程序运行时异常或错误的记录,包含了调用堆栈的信息,即函数调用的顺序。在JavaScript...
【LvServerInfo .NET源码探针】是一个专为.NET平台设计的工具,它主要用于监控和分析.NET应用程序的运行状态,提供深入的服务器信息和应用性能数据。此探针可以帮助开发者和运维人员更好地理解应用程序在运行时的...
这样,开发者就可以在日志中查找与异常相关的堆栈信息,分析错误来源。 使用这个模块,开发者需要注意以下几点: 1. 配置:在Nginx配置文件中正确地加载和启用ngx_xqw_backtrace_module。通常,这需要在http、...
本文将详细解析标题为“简单易懂的C语言代码跟踪日志源码”的资源,该资源旨在提供一个易于理解和使用的C语言日志系统,灵感来源于SexyAppFramework框架。 首先,让我们来探讨C语言日志的基本概念。C语言是一种底层...
调试器是软件开发过程中的重要工具,用于检查和分析程序的运行状态,找出并修复错误。本资源"简单调试器源码"是一个专门为新手设计的学习项目,旨在帮助初学者理解调试器的基本工作原理。让我们深入探讨一下调试器的...
这些日志可以包括堆栈跟踪、系统状态、内存信息等,这对于调试和分析问题原因非常有帮助。日志信息通常会被保存在设备上,或者通过分享功能发送给开发者。 在实际的Android开发中,为了提高应用的稳定性和用户体验...
3. **源码分析** `CustomTiledLayerSample`的源码展示了如何创建一个自定义的瓦片图层实例。首先,你需要定义一个类并继承自`AGSTiledLayer`,然后重写必要的方法。例如,你可以看到源码中是如何加载本地或远程的...
- 通过深入剖析`start.S`,使得读者能够掌握启动过程的基本原理,并能触类旁通地应用于其他类似系统的启动源码分析中。 ##### 1.3. 代码来源 本分析所依据的代码来自天嵌官方网站提供的Uboot版本: - 版本:u-...
这可能包括错误代码、堆栈跟踪或其他有助于理解问题来源的数据。 6. **重试机制**:某些API错误可能是暂时的,例如网络中断或系统繁忙。在这种情况下,可以设计一个重试机制,让程序在特定条件下重新尝试API调用。 ...
Indigo是一款专为Java开发设计的错误报告生成器,它主要功能是帮助开发者在应用程序运行时收集、整理和分析错误信息,以便快速定位并解决软件中的问题。Indigo的使用可以显著提高故障排查效率,减少因为错误信息不...
2. **添加标签和线程信息**:每个日志记录都可以附带特定的标签和线程信息,便于追踪问题来源。 3. **格式化输出**:可以控制日志的输出格式,使其更易读,如添加颜色、时间格式等。 4. **过滤和搜索**:提供自定义...
1. **断点**:这是最基础的调试手段,可以在代码的特定位置设置断点,当程序运行到该位置时暂停,允许开发者检查此时的变量值、调用堆栈等信息。 2. **步进执行**:包括单步进入、单步跳过和单步退出,用于跟踪代码...