java 检测class文件走哪个jar包的代码
2017-05-18 20:30
274 查看
有些时候多个版本的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代码
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
感谢楼主分享
有一个可以检测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代码
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
感谢楼主分享
相关文章推荐
- java中.class文件打包成.jar文件问题
- 用jar命令将java class文件打包以及编写方便执行jar文件的批处理文件
- java class文件生成jar包
- eclipse查看class文件属于哪个jar
- java 自带jar命令打包class文件
- 将Java *.Class 打包成可执行的*.jar文件
- 把java中的class文件打包成.jar (jar命令详解)
- 使用java命令行执行依赖外部jar包的class文件
- jar 打包java class文件后,运行jar 出现 Failed to load Main-Class manifest attribute from 错误
- JAVA功能代码《7》----Java创建ZIP和JAR文件
- 文件中加载jar及Class,启动Java(Windows及Linux)
- 分享非常有用的Java程序 (关键代码) (三)---创建ZIP和JAR文件
- 如何定位某个java类在哪个jar文件
- java获取运行的jar(class)文件的路径
- java的*.class打包成jar文件
- java识别文件编码格式代码(无引用jar包,测试可行)
- java .class文件打包成.jar文件
- 运行代码在MyEclipse中将JAVA项目打包成JAR文件
- 运用URLClassLoader加载外部jar包的java类,生成Class文件