`

Tomcat的启动

阅读更多
以tomcat为例,看tomcat是怎样启动的。tomcat中有一个startup.bat 批处理文件,这个文件会启动另一个批处理文件
catalina.bat 而这个批处理会设置set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar
也就是把bootstrap.jar所在目录加入classpath中,这样就可以通过jre来运行bootstrap.jar,
我们看到在这个包中的
MANIFEST.MF的文件内容如下:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 1.5.0_06-b05 (Sun Microsystems Inc.)
Main-Class: org.apache.catalina.startup.Bootstrap
Specification-Title: Catalina
Specification-Version: 6.0
Class-Path: commons-daemon.jar commons-logging-api.jar tomcat-juli.jar
  这里Main-Class: org.apache.catalina.startup.Bootstrap 指定了主函数所在的类,很显然,JVM通过这个文件找到
  主函数,并进入这个类中的主函数入口执行。然后就一步步完成tomcat的启过程。

2.1 TOMCAT自己的类载入器(ClassLoader)加载流程如下:
       +---------------------------+
       |         Bootstrap         |
       |             |             |
       |          System           |
       |             |             |
       |          Common           |
       |         /      \          |
       |     Catalina  Shared      |
       +---------------------------+
其中:
-Bootstrap –
    载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar。

- System -
①载入$CATALINA_HOME/bin/bootstrap.jar  初始化Tomcat,执行Main方法。
②$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下,默认情况会包含以下几个包:
①jndi.jar JNDI API接口,这个包仅在Java1.2时候装入,1.3以后的版本JDK已自动装入。
②naming-common.jar JNDI接口实现类,Tomcat用这些类在内存中使用Context。
③naming-resources.jar JNDI实现,Tomcat用它们定位Web App的静态资源。
④servlet.jar Servlet,Jsp API。
⑤xerces.jar XML解析器,特定的Web App可以在自己的/WEB-INF/lib 中覆盖。

- Catalina -
    装入Tomcat实现所有接口的类,这些类对Web App是完全不可见的,所有未打包的类在$CATALINA_HOME/server/classes,所有jar包在$ CATALINA_HOME/server/lib下。一般情况该ClassLoader将Load下面几个包:
①catalina.jar Servlet容器的Tomcat实现包。
②jakarta-regexp-X.Y.jar 正则表达式,请求过滤时使用。
③servlets-xxxxx.jar Servlet支持包。
④tomcat-coyote.jar Tomcat的Coyote连接实现包。
⑤tomcat-jk.jar Web Server绑定包,允许Tomcat绑定Apache等作为Web Server。
⑥tomcat-jk2.jar 功能同上。
⑦tomcat-util.jar Tomcat工具类,可能被一些Connector用到。
⑧tomcat-warp.jar 用于Apache Server包。

- Shared -
    载入所有WEB APP都可见的类,对TOMCAT不可见。 所有未打包的类在$CATALINA_HOME/shared/classes,所有jar包在$CATALINA_HOME /lib下。默认情况包含下面几个包:
①jasper-compiler.jar Jsp编译器,编译Jsp为Servlet。
②jasper-runtime.jar Jsp(已编译成Servlet)运行支持包。
③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。

2.2 下面总结Tomcat类加载过程
Bootstrap($JAVA_HOME/jre/lib/ext/*.jar)
System($CLASSPATH/*.class和指定的jar)
Common($CATALINA_HOME/common 下的classes,lib,endores三个子目录)
Catalina ($CATALINA_HOME/server/下的classes和lib目录仅对Tomcat可见)
Shared($CATALINA_HOME/shared/下的classes和lib目录以及$CATALINA_HOME/lib目录)
    仅对Web应用程序可见,对Tomcat不可见WebApp($WEBAPP/Web-INF/*仅对该WEB应用可见classes/*.class lib/*.jar)

2.3加载类和资源的顺序为:
1、/Web-INF/classes
2、/Web-INF/lib/*.jar
3、Bootstrap
4、System
5、$CATALINA_HOME/common/classes
6、$CATALINA_HOME/common/endores/*.jar
7、$CATALINA_HOME/common/lib/*.jar
8、$CATALINA_HOME/shared/classes
9、$CATALINA_HOME/shared/lib/*.jar

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics