Tomcat知识连载---源码分析Bootstrap
2源码分析:
class Bootstrap
package org.apache.catalina.startup;
// JDK类库
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
// apache自己的类库
import org.apache.catalina.loader.Extension;
import org.apache.catalina.loader.StandardClassLoader;
/**
* Boostrap loader for Catalina. This application constructs a class loader
* for use in loading the Catalina internal classes (by accumulating all of the
* JAR files found in the "server" directory under "catalina.home"), and
* starts the regular execution of the container. The purpose of this
* roundabout approach is to keep the Catalina internal classes (and any
* other classes they depend on, such as an XML parser) out of the system
* class path and therefore not visible to application level classes.
*
* @author Craig R. McClanahan
* @version $Revision: 1.36 $ $Date: 2002/04/01 19:51:31 $
*/
/**
* 该类的main方法的主要任务:
* --------------------------
*
* 1,创建TOMCAT自己的类载入器(ClassLoader)
* +---------------------------+
* | Bootstrap |
* | | |
* | System |
* | | |
* | Common |
* | / \ |
* | Catalina Shared |
* +---------------------------+
* 其中:
* - Bootstrap - 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar
* - System - 载入$CLASSPATH/*.class
* - Common - 载入$CATALINA_HOME/common/...,它们对TOMCAT和所有的WEB APP都可见
* - Catalina - 载入$CATALINA_HOME/server/...,它们仅对TOMCAT可见,对所有的WEB APP都不可见
* - Shared - 载入$CATALINA_HOME/shared/...,它们仅对所有WEB APP可见,对TOMCAT不可见(也不必见)
* 注意:当一个ClassLoader被请求载入一个类时,它首先请求其父ClassLoader完成载入,
* 仅当其父ClassLoader无法载入该类时,才试图自己载入该类
* 2,改变本身线程的默认ClassLoader(本线程就是Tomcat Server线程,类载入器是catalinaLoader)
* 3,让catalinaLoader载入一些类,类的位置在$CATALINA_HOME/server/lib/catalina.jar中
* 4,创建org.apache.catalina.startup.Catalina类的一个实例startupInstance,并为其调用方法:
* startupInstance.setParentClassLoader(sharedLoader);
* startupInstance.process(args);
*
*
* 有关ClassLoader的说明:
* -----------------------
*
* 每个被DEPLOY的WEB APP都会被创建一个ClassLoader,用来载入该WEB APP自己的类
* 这些类的位置是webappX/WEB-INF/classes/*.class和webappX/WEB-INF/lib/*.jar
*
* ClassLoader的工作流程是:
* 1) 收到一个载入类的的请求
* 2) 请求其父ClassLoader来完成该类的载入
* 3) 如果父ClassLoader无法载入,则自己试图完成该类的载入
*
* 特别注意WEB APP自己的ClassLoader的实现与众不同:
* 它先试图从WEB APP自己的目录里载入,如果失败则请求父ClassLoader的代理
* 这样可以让不同的WEB APP之间的类载入互不干扰
*
* WEB APP的ClassLoader的层次结构是:
* +----------------------------+
* | Shared |
* | / \ ... |
* | Webapp1 Webapp2 ... |
* +----------------------------+
* 故对于一个WEB APP,其类载入的优先顺序如下:
* - /WEB-INF/classes/*.class 和 /WEB-INF/lib/*.jar
* - Bootstrap classes of JVM
* - System class loader classes
* - $CATALINA_HOME/common/...
* - $CATALINA_HOME/shared/...
*
*
* 小结:
* ------
*
* 综上分析
* - Tomcat Server线程使用的classLoader是Catalina
* - 每个WEB APP线程使用的classloader是Webapp
*
*/