最近项目从weblogic迁移至tomcat测试环境测试是,接口报错:java.lang.NoClassDefoundError
报错的类是axis.jar(org.apache.axis)放在项目的WEB-INF/lib里,同样在weblogic没有问题,后来研究tomcat和weblogic类加载器,希望找到答案。
weblogic:
类加载器在加载类时使用委托模型。类加载器实现首先检查其缓存,以查看是否已加载所请求的类。此类验证可提高性能,因为它使用了缓存的内存副本,而不是从磁盘重复加载类。如果在其缓存中找不到该类,则当前的类加载器会向其父级询问该类。仅当父级无法加载类时,类加载器才会尝试加载该类。如果父类和子类加载器中都存在类,则加载父版本。遵循此委派模型以避免加载相同表单的多个副本。同一类的多个副本可以导致a ClassCastException。
- JDK Classloader
- JDK ext Class Loader
- Weblogic System Class Loader
- Domain Class Loader(Child of System Class Loader)
- App Class Loader (负责装载应用中的所有的EJB JAR文件)
- Web Class Loader (负责装载所有的Web application 中的WAR文件(所有得jsp文件除外)
- JSP Class Loader (负责装载Web application 中的所有的jsp文件)
tomcat:
1 Bootstrap 引导类加载器
加载JVM启动所需的类,以及标准扩展类(位于jre/lib/ext下)
2 System 系统类加载器
加载tomcat启动的类,比如bootstrap.jar,通常在catalina.bat或者catalina.sh中指定。位于CATALINA_HOME/bin下。
3 Common 通用类加载器
加载tomcat使用以及应用通用的一些类,位于CATALINA_HOM