有些时候多个版本的jar包同时存在,会导致类冲突,今天遇到这样的问题,去网上找资料 整理了一下。
有一个可以检测class文件走哪个jar包的代码,很不错,以后迷茫时可以用用,这里粘过来分享下:
方式一(测试有效):
ClassLoader classloader =
URL res = classloader.getResource(
String path = res.getPath();
System.out.println("POI Core came from " + path);
classloader = org.apache.poi.POIXMLDocument.class.getClassLoader();
res = classloader.getResource("org/apache/poi/POIXMLDocument.class");
path = res.getPath();
System.out.println("POI OOXML came from " + path);
classloader = org.apache.poi.hslf.HSLFSlideShow.class.getClassLoader();
res = classloader.getResource("org/apache/poi/hslf/HSLFSlideShow.class");
path = res.getPath();
System.out.println("POI Scratchpad came from " + path);
检测后,发现确实有一个class走了老包,只删java build path没生效。后来把workspace里面的包删了再把project clean一下,然后重新部署,OK,问题解决了!
原文链接:http://blog.sina.com.cn/s/blog_66dddb8b0102xp9s.html
感谢楼主分享
//-------------------------分割线--------------------------------
方式二(未测试):
java的类装载器使用的是优先策略,加载类的时候先找到哪个就加载哪个。有时候我们做一个系统,当类库非常庞大的时候,类可能会出现冲突,也就是类路径中存在不同版本的两个相同的类,这往往给调试带来非常大的麻烦,我们可能修改了类,但由于类加载器却使用的是另外一个未被更新的类,这个时候就会丈二和尚摸不着头脑,一度使调试过程误入歧途。
那么怎么来确定我当前所加载的类是位于哪个路径或者存在于哪个jar包当中呢?Java语言给我们的解决方案如下代码所示:
- import java.security.CodeSource;
- import java.security.ProtectionDomain;
- import org.apache.commons.lang.StringUtils;
- /**
- * 判断类是从哪个jar包中加载的
- * @author Winter Lau
- */
- public class Test {
- public static void main(String[] args) {
- ProtectionDomain pd = StringUtils.class.getProtectionDomain();
- CodeSource cs = pd.getCodeSource();
- System.out.println(cs.getLocation());
- }
- }
这段代码在我的机器上运行的结果是:
file:/D:/PROJECTS/JAVA/DLOG4J_JAVAYOU/webapp/WEB-INF/lib/commons-lang-1.0.1.jar
这就是StringUtils这个类所在的jar包,一目了然。但是有一个限制经由系统类加载器所加载的类不能使用该方法来获取路径,假如你对 String类做上面的测试就会发生空指针异常,因为所得到的CodeSource为空,你可以在程序启动的时候使用-verbose来查看系统类的装载信息,使用方式有如:
java -verbose MyApp
原文链接:http://kejun.iteye.com/blog/510999
感谢楼主分享