运行时查看类所在jar包

把应用程序发布到websphere上,会发生各种各样的问题。

最常见的莫过于 java.lang.NoSuchMethodError。

这个错往往是websphere自身加载的库和应用程序的库存在同样名字的类,

由于加载顺序,产生此问题。

要快速的找到产生异常的类所在的jar包,才能较快的解决问题。

下面的代码可以输出ServletFileUpload类运行时的jar包。

1         String className = ServletFileUpload.class.getName();
2         className = className.replace('.', '/');
3         String resource = "/" + className + ".class";
4         URL url = ServletFileUpload.class.getResource(resource);
5         logger.info(url.getFile());

输出结果:

file:/opt/IBM/WebSphere/AppServer8/profiles/AppSrv01/installedApps/localhostNode02Cell/XXX.ear/XXX.war/WEB-INF/lib/commons-fileupload-1.2.2.jar!/org/apache/commons/fileupload/servlet/ServletFileUpload.class

追加:

有时候这种方法还是看不到jar包信息,可能的情况是冲突的Jar包在webshpere启动的时候已经加载进来。

在输出的地方加入下面的代码,可以看到更多的信息(包括来自哪个Jar包):

1 logger.info(ObjectMapper.class.getProtectionDomain().toString());

 

另外也可以直接输出到JSP页面查看,代码如下:

 1 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
 2     pageEncoding="ISO-8859-1"%>
 3 <%@ page import="java.net.URL,org.codehaus.jackson.map.ObjectMapper,com.newpp.core.util.ConfigManager"%> 
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 8 </head>
 9 <body>
10 <%
11     String className = ObjectMapper.class.getName();
12     className = className.replace('.', '/');
13     String resource = "/" + className + ".class";
14     URL url = ObjectMapper.class.getResource(resource);
15     out.println(ObjectMapper.class.getProtectionDomain().toString());
16     out.write("\r");
17     out.println(url.getFile());
18     out.write("\r");
19     out.println(url.getPath());
20 %>
21 </body>
22 </html>

 

posted @ 2014-10-31 20:05  havery  阅读(1538)  评论(0)    收藏  举报