Tomcat的启动

转载:http://wwwdd2315.blog.163.com/blog/static/66661889201082585444103/

以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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值