`
dengyin2000
  • 浏览: 1209451 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Tomcat类装载的问题.

阅读更多
昨天发布一个web application的时候发现一个奇怪的问题, 明明jar包里面有的类说找不到, 真是奇怪. 不过要下班了. 明天再说吧.

java.lang.NoClassDefFoundError: com/netsboss/util/dbobject/GeneralEntity
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClass(ClassLoader.java:620)
java.lang.ClassLoader.defineClass(ClassLoader.java:465)
com.netsboss.util.proxy.ProxyClassLoader.defineClass(ProxyClassLoader.java:75)
com.netsboss.util.proxy.Proxy.getProxyClass(Proxy.java:216)
com.netsboss.util.dbobject.DatabaseManager.generateClass(DatabaseManager.java:1161)
com.netsboss.util.dbobject.DatabaseManager.<init>(DatabaseManager.java:240)
com.netsboss.util.dbobject.DatabaseManager.getDatabaseManager(DatabaseManager.java:98)
com.aft.constants.SystemConstants.getDefaultAFTDatabaseManager(SystemConstants.java:258)
com.aft.database.retrieve.CAFTDBGetWebUserInfo.<init>(CAFTDBGetWebUserInfo.java:64)
com.aft.database.retrieve.CAFTDBGetWebUserInfo.getCAFTDBGetWebUserInfo(CAFTDBGetWebUserInfo.java:51)
com.aft.servlets.actions.RegisterAction.perform(RegisterAction.java:43)
org.apache.struts.action.Action.execute(Action.java:420)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

上面的是异常的信息, 我明明把含有这个类的jar包放到了WEB-INF/lib下面. 怎么办,还能这么办, trace code.
结果发现在了一个自定义的类装载器com.netsboss.util.proxy.ProxyClassLoader,他在构着函数里面没有传他的parent classloader(tomcat Webapp classloader)进去, 所以他的parent classloader是systemclassloader, 我想假如ProxyClassLoader的构着函数里面调用了super(ProxyClassLoader.class.getClassLoader());的话,
 应该能解决这个问题的. 我想这个就是这个java.lang.NoClassDefFoundError异常的原因吧.

这里有篇介绍类装载的问题, 也介绍了Tomcat类装器的机制.
http://blog.csai.cn/blog/number01/2005628165135.html
</init></init>
添加一些: 
这个是自定义的classloader, 他在构着函数里面没有传他的parent classloader(tomcat Webapp classloader)进去, 所以他的parent classloader是systemclassloader,
具体代码看java.lang.ClassLoader. 
    /**
* Creates a new class loader using the specified parent class loader for
* delegation.
*
*

If there is a security manager, its {@link
* SecurityManager#checkCreateClassLoader()
* checkCreateClassLoader} method is invoked. This may result in
* a security exception.


*
* @param parent
* The parent class loader
*
* @throws SecurityException
* If a security manager exists and its
* checkCreateClassLoader method doesn&apost allow creation
* of a new class loader.
*
* @since 1.2
*/
protected ClassLoader(ClassLoader parent) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkCreateClassLoader();
}
this.parent = parent;
initialized = true;
}
    /**
* Creates a new class loader using the ClassLoader returned by
* the method {@link #getSystemClassLoader()
* getSystemClassLoader()} as the parent class loader.
*
*

If there is a security manager, its {@link
* SecurityManager#checkCreateClassLoader()
* checkCreateClassLoader} method is invoked. This may result in
* a security exception.


*
* @throws SecurityException
* If a security manager existsand its
* checkCreateClassLoader method doesn&apost allow creation
* of a new class loader.
*/
protected ClassLoader() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkCreateClassLoader();
}
this.parent = getSystemClassLoader();
initialized = true;
}
 
package com.netsboss.util.proxy;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Locale;
import org.apache.log4j.Category;
 
public class ProxyClassLoader extends ClassLoader {
 
 private static Category log = Category.getInstance(ProxyClassLoader.class);
 private HashMap classes = new HashMap();
 private boolean saveToClassPath = false;
 
 public ProxyClassLoader(boolean saveToClassPath){
  this.saveToClassPath = saveToClassPath;
 }
 
 /**
  * @see ClassLoader#findClass(String)
  */
 protected Class findClass(String name) throws ClassNotFoundException {
 
  Class find = super.findClass(name);
  if(find != null) return find;
 
  find = (Class)classes.get(name);
  if(find != null) return find;
  else throw new ClassNotFoundException(name);
 
 }
 
 public void defineClass(byte classfile[], String classname){
 
  Class clazz = defineClass(classname, classfile,0, classfile.length);
  classes.put(classname,clazz);
 
  if(saveToClassPath){
   saveToClassPath(classfile, classname);
  }
 
 }
 
 /**
  * return a class which implements all the interfaces or inherit from one of class
  * currently, just return null.
  */
 public Class search(Class interfaces[]){
  return null;
 }
 
 private void saveToClassPath(byte classfile[], String classname){
  String filename = classname + ".class";
 
  URL url = getClass().getProtectionDomain().getCodeSource().getLocation();
  if( "file".equals(url.getProtocol()) && (url.getHost() == null || url.getHost().equals("")) ){
      String dir = null;
      try{
dir = URLDecoder.decode(url.getFile(), "UTF-8");
}catch(UnsupportedEncodingException ex){
log.error("Encoding not supported", ex);
}
 
   File classpath = new File(dir);
   if(classpath.isDirectory() == false){
    log.info("Classpath error for ProxyClassLoader:" + dir + " not a directory");
    return;
   }
   File file = new File(classpath, filename);
   try {
    FileOutputStream os = new FileOutputStream(file);
    os.write(classfile);
    os.close();
   }
   catch(IOException ex){
log.error("Error writing Proxy Class file", ex);
ex.printStackTrace();
   }
  }
 
 }
 
}
参考这篇文章
http://www.cjsdn.net/post/view?bid=29&id=162060&sty=1&tpg=1&age=0
分享到:
评论

相关推荐

    apache-tomcat-8.5.40.tar.zip

    tomcat是一个开源而且免费的jsp服务器,属于轻量级应用服务器。它可以实现JavaWeb程序的装载,是配置JSP(Java Server Page)和JAVA系统必备的一款环境。

    apache-tomcat-7.0.75

    apache_tomcat_7.0.75, 可以装载dubbo-admin项目,已经配置好,可以运行dubbo项目

    Tomcat-8.5.41-windows-x64.rar

    tomcat的8.5.41版本,它可以实现JavaWeb程序的装载,是配置JSP(Java Server Page)和JAVA系统必备的一款环境

    Linux下tomcat多实例配置

    Linux下tomcat多实例配置成功。步骤如下:  1. 下载一个免安装版本的tomcat,例如:...  webapps (自动装载的应用程序的目录)  work (JVM临时文件目录[java.io.tmpdir])  这几个文件夹中,只有bin,lib可以被多

    Java开发技术大全(500个源代码).

    loadClass.java 动态装载一个类 Shape.java 一个用于测试的简单类 useArray1.java 用反射机制使用数组示例1 useArray2.java 用反射机制使用数组示例2 第10章 示例描述:本章学习泛型。 demoBounds.java 演示有...

    jdk,tomcat.Eclipse,mysql装机文档

    针对每一个开发工具详细记录每一个流程便于装载时出现你的误解

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.1.2. 在Tomcat 服务器上运行示例.......................................................................................................................... 15 1.1.3. 运行测试..............................

    TOMCAT的安装以及常见问题的解决

    TOMCAT是一个开源而且免费的jsp服务器,可实现JavaWeb程序的装载,是配置JSP(Java Server Page)和JAVA系统必备的一款环境 下面简述一下Tomcat的安装以及安装中常见的一些问题与解决方法 1.JDK的安装: 下载链接:...

    spring 重新动态加载数据库或xml中的bean,可以不用重启tomcat

    spring 重新动态加载数据库或xml中的bean,可以不用重启tomcat

    hibernate3.04中文文档.chm

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class ...

    hibernate 框架详解

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class ...

    Hibernate教程

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2...

    jsp全攻略,tomcat技术

    reloadable 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序 host (表示一个虚拟主机...

    最全Hibernate 参考文档

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 ...

    Hibernate3+中文参考文档

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 ...

    Hibernate3的帮助文档

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2...

    将Tomcat Service化

    按照&lt;Tomcat&gt;一文还是需要手工启动tomcat,这非常烦人的说我们可以借助一些工具是的tomcat作为windows nt 的一个service,在windows启动时自动装载,步骤如下:1,下载工具,我用的是gservany – Utility to ...

    apache-tomcat-11.0.0-M3-windows-x64

    它是由Apache推出的一款免费开源的Servlet容器,可实现JavaWeb程序的装载,是配置JSP(Java Server Page)和JAVA系统必备的一款环境。它也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,在处理静态...

    iuhyiuhkjh908u0980

    PrettyFaces优雅的解决了这个问题,包括诸如功能:网页装载行动,无缝的跟faces的导航整合,动态视图的ID分配和管理参数分析,无需配置,兼容其他JSF框架。P ... by zly06 2009-09-09 回复 (0) 相关博客 ant模板 ...

Global site tag (gtag.js) - Google Analytics