如何解决包冲突,类加载错误的一个方法
2015-09-08 18:37
585 查看
今天碰到一个问题,使用activemq发送消息时一直报找不到方法:java.lang.NoSuchMethodError:org.slf4j.MDC.getCopyOfContextMap()Ljava/util/Map;,但是发现这个MDC类在activemq-all.jar中,查看源码确认是有这个方法,那肯定加载的不是这个包下的类。可那么多包怎么知道它加载了谁。使用下面代码即知:
import java.security.CodeSource;
import java.security.ProtectionDomain;
import org.springframework.util.StringUtils;
/**
*
查看加载的类的路径
*
*
这就是StringUtils这个类所在的jar包,一目了然。但是有一个限制经由系统类加载器所加载的类不能使用该方法来获取路径,
*
假如你对String类做上面的测试就会发生空指针异常,因为所得到的CodeSource为空,你可以在程序启动的时候使用
*
-verbose来查看系统类的装载信息,使用方式有如:
*
* java
-verbose MyApp
*
* @authoryicong
*/
public class CheckClassLoader {
public static void main(String[]args)
{
ProtectionDomainpd = StringUtils.class.getProtectionDomain();
CodeSourcecs =pd.getCodeSource();
System.out.println(cs.getLocation());
}
}
一看发现JavaEE 6.0 generic libraries中的bean-validtor.jar中有同路径的包,马上修改加载顺序即解决。
eclipse中可以设置类加载顺序,请见图。
import java.security.CodeSource;
import java.security.ProtectionDomain;
import org.springframework.util.StringUtils;
/**
*
查看加载的类的路径
*
*
这就是StringUtils这个类所在的jar包,一目了然。但是有一个限制经由系统类加载器所加载的类不能使用该方法来获取路径,
*
假如你对String类做上面的测试就会发生空指针异常,因为所得到的CodeSource为空,你可以在程序启动的时候使用
*
-verbose来查看系统类的装载信息,使用方式有如:
*
* java
-verbose MyApp
*
* @authoryicong
*/
public class CheckClassLoader {
public static void main(String[]args)
{
ProtectionDomainpd = StringUtils.class.getProtectionDomain();
CodeSourcecs =pd.getCodeSource();
System.out.println(cs.getLocation());
}
}
一看发现JavaEE 6.0 generic libraries中的bean-validtor.jar中有同路径的包,马上修改加载顺序即解决。
eclipse中可以设置类加载顺序,请见图。
相关文章推荐
- matlab 在图像处理中常用的函数使用(1)
- Python_基础知识储备
- java scanner next nextline nextint区别
- 使用jmeter进行性能测试-Jmeter教程及技巧汇总 (转)
- zabbix------了解zabbix
- 监控宝首推Docker监控 确保容器稳定运行
- HDOJ 题目3487 Play with Chain(Splay Tree)
- searchBar 背景框的移除
- iOS获取UUID,并使用keychain存储
- mysql之union合并查询
- 9.8學習內容
- 25/9/8/SQLite/ContentProvider
- Mac Wifi 使用模式切换小记
- Web 安全检测工具的使用
- 自定义实现输入输出模版的一个例子
- 查看linux硬件信息
- 开机启动报Winload.exe出现0xc000000e错误的解决办法
- 如何等待java线程池中所有任务完成
- EAS 中重定向 Context及获得用户密码策略
- 【特征匹配】Fast原理及源码解析