Tomcat中的类加载器

对于Tomcat中的类加载问题,在看张孝祥的视频教程中没听进去,讲得太烦,索性阅读了tomcat的how-to文档,不甚懂,自己的理解如下,差不多就是文档的自我理解中文翻译。

Tomcat 6 中的类加载跟J2SE中的类加载是差不多的,即 differs slightly from this, as discussed below, but the main principles are the same.类加载器形成了一个上下相互继承的树状结构。Tomcat 6 的这颗树如下:



      Bootstrap
          |
       System
          |
       Common
       /     /
  Webapp1   Webapp2 ...

当一个类加载器要加载一个类或资源时,首先将请求传递给他的父加载器,让他的父加载器来加载。当父加载器找不到要加载的类或资源时,才会传回它的子加载器来加载。当子加载器也加载不到时,便抛出ClassNotFound异常。

在tomcat中,照上面那棵树结构所示,顶级为Bootstrap加载器,它是内嵌在JVM中用C++编写的加载器,所以它不是一个class。它主要加载jdk基本的类和位于$JAVA_HOME/jre/lib/ext中的类。

下一层为System加载器,它加载位于CLASSPATH中的类,但是它不继承系统中的CLASSPATH,而是在 $CATALINA_HOME/bin/catalina.sh (Linux/Unix)或 %CATALINA_HOME%/bin/catalina.bat(Windows)中的CLASSPATH指定的路径,包括:

$CATALINA_HOME/bin/bootstrap.jar ——Tomcat启动所需要的类

$CATALINA_HOME/bin/tomcat-juli.jar—— 用户Bootstrap的日志

$JAVA_HOME/lib/tools.jar ——java编译工具,javac等

再往下一层是Common加载器,它加载web应用所需要的类。而且通常程序员编写的应用程序类是不可以放在这个目录下的。这个目录下主要包括的jar包有:

annotations-api.jar - JEE annotations classes.
catalina.jar - Implementation of the Catalina servlet container portion of Tomcat 6.
catalina-ant.jar - Tomcat Catalina Ant tasks.
catalina-ha.jar - High availability package.
catalina-tribes.jar - Group communication package.
el-api.jar - EL 2.1 API.
jasper.jar - Jasper 2 Compiler and Runtime.
jasper-el.jar - Jasper 2 EL implementation.
jasper-jdt.jar - Eclipse JDT 3.2 Java compiler.
jsp-api.jar - JSP 2.1 API.
servlet-api.jar - Servlet 2.5 API.
tomcat-coyote.jar - Tomcat connectors and utility classes.
tomcat-dbcp.jar - package renamed database connection pool based on Commons DBCP.
tomcat-i18n-**.jar - Optional JARs containing resource bundles for other languages. As default bundles are also included in each individual JAR, they can be safely removed if no internationalization of messages is needed.
最底层是应用程序类加载器,每一个web程序都有一个加载器。它用来加载$CATALINA_HOME/Webapps/[appname]/WEB-INF/classes 和$CATALINA_HOME/Webapps/[appname]/WEB-INF/lib 下的jar包和类。

 

关于java的代理模式,暂时不懂。

你可能感兴趣的:(java,tomcat,servlet,webapp,Annotations)