运行时查看类所在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>