java 检测class文件走哪个jar包的代码

本文提供两种方法用于检测Java环境中特定类文件的加载来源,帮助解决因类库版本冲突导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


有些时候多个版本的jar包同时存在,会导致类冲突,今天遇到这样的问题,去网上找资料 整理了一下。

有一个可以检测class文件走哪个jar包的代码,很不错,以后迷茫时可以用用,这里粘过来分享下:

方式一(测试有效):


ClassLoader classloader =
   org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
URL res = classloader.getResource(
             "org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
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语言给我们的解决方案如下代码所示:      

Java代码  收藏代码
  1. import java.security.CodeSource;  
  2. import java.security.ProtectionDomain;  
  3.   
  4. import org.apache.commons.lang.StringUtils;  
  5.   
  6. /** 
  7.  * 判断类是从哪个jar包中加载的 
  8.  * @author Winter Lau 
  9.  */  
  10. public class Test {  
  11.   
  12.  public static void main(String[] args) {  
  13.   ProtectionDomain pd = StringUtils.class.getProtectionDomain();  
  14.   CodeSource cs = pd.getCodeSource();  
  15.   System.out.println(cs.getLocation());  
  16.  }  
  17. }  


这段代码在我的机器上运行的结果是: 

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

感谢楼主分享




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值