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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值