Tomcat的Classloader

来源:互联网 发布:wifi网络电话机 编辑:程序博客网 时间:2024/06/03 14:33
Tomcat的启动是从解析bat文件开始,bat文件最终调用org.apache.catalina.startup.Bootstrap开始类的加载。  
Java代码  收藏代码
  1. commonLoader = createClassLoader("common"null);  
  2.  if(commonLoader == null)  
  3.    commonLoader = getClass().getClassLoader();  
  4.    catalinaLoader = createClassLoader("server", commonLoader);  
  5.    sharedLoader = createClassLoader("shared", commonLoader);  

这是org.apache.catalina.startup.bootstrap;的代码 

初始化Classloader的一个过程 
如果跟踪看createClassLoader 
调用自身的方法 createClassLoader,最终是执行ClassloaderFactory的方法 
Java代码  收藏代码
  1. if(parent == null)  
  2.      classLoader = new StandardClassLoader(array);  
  3.  else  
  4.      classLoader = new StandardClassLoader(array, parent);  
  5.    return classLoader;  

parent就是上面传递的commLoader 
其实他们的parent的class是org.apache.catalina.loader.standardClassLoader 
只是他们的名字是 上面的名字 
例如 commentloader加载的类  getClassLoader是stanardClassLoader 
standardClassLoader是URLClassloader的子类 
(URLClassloader是java.security.SecureClassLoader的子类,java.security.SecureClassLoader 
是Classloader的子类  java.security.SecureClassLoader扩展了Classloader,他还可以支持使用相关的代码源和权限定义类) 
+---------------------------+ 
       |         Bootstrap         | 
       |             |             | 
       |          System           | 
       |             |             | 
       |          Common           | 
       |         /      \          | 
       |     Catalina Shared      | 
       +---------------------------+ 
下面是各自的只能 

- Bootstrap - 
载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar 
- System    
1.载入$CATALINA_HOME/bin/bootstrap.jar 初始化Tomcat,执行Main方法 
2. $JAVA_HOME/lib/tools.jar Sun的工具类,包括编译Jsp为Servlet的工具类 
- Common     
这个目录下的类虽然对TOMCAT和所有的WEB APP都可见.但是Web App的类不应该 放在这个目录下,所有未打包的Class都在$CATALINA_HOME/common/classes下,所 
  有打包的jar都在 $CATALINA_HOME/commons/endorsed $CATALINA_HOME/common/lib下,默认情况会  包含以下几个包: 
1. jndi.jar JNDI API接口,这个包仅在Java1.2时候装入,1.3以后的版本JDK已 
自动装入. 
2. naming-common.jar JNDI接口实现类,Tomcat用这些类在内存中使用Context. 
3. naming-resources.jar JNDI实现,Tomcat用它们定位Web App的静态资源. 
4. servlet.jar Servlet,Jsp API 
5. xerces.jar XML解析器,特定的Web App可以在自己的/WEB-INF/lib 中覆盖. 
- Catalina 
装入Tomcat实现所有接口的类,这些类对Web App是完全不可见的,所有未打包的类在 $CATALINA_HOME/server/classes所有jar包在$CATALINA_HOME/server/lib下.一 般情况该ClassLoader将Load下面几个包: 
                 1. catalina.jar Servlet容器的Tomcat实现包 
                    2. jakarta-regexp-X.Y.jar 正则表达式,请求过滤时使用 
                    3. servlets-xxxxx.jar Servlet支持包 
                    4. tomcat-coyote.jar Tomcat的Coyote连接实现包 
                    5. tomcat-jk.jar Web Server绑定包,允许Tomcat绑定Apache等作为Web Server 
                 6. tomcat-jk2.jar 功能同上 
                    7. tomcat-util.jar Tomcat工具类,可能被一些Connector用到 
                    8. tomcat-warp.jar 用于Apache Server包 
- Shared   
载入所有WEB APP都可见的类,对TOMCAT不可见. 所有未打包的类在 
  $CATALINA_HOME/shared/classes所有jar包在$CATALINA_HOME /lib下. 
默认情况包含下面几个包: 
1. jasper-compiler.jar Jsp编译器,编译Jsp为Servlet 
2. jasper-runtime.jar Jsp(已编译成Servlet)运行支持包 
3. naming-factory.jar 支持Web App使用JNDI的封装包-WebAppX   Web App ClassLoader,当Web App被部署是该ClassLoader被创建.所有class都在 WEB-INF/classes下,所有jar在WEB-INF/lib下. 
  
特别注意WEB APP自己的ClassLoader的实现与众不同: 
它先试图从WEB APP自己的目录里载入,如果失败则请求父ClassLoader的代理 
这样可以让不同的WEB APP之间的类载入互不干扰.另,Tomcat Server使用的是Catalina   
ClassLoader,一般的Web App使用的是WebApp ClassLoader. 
0 0
原创粉丝点击