背景我们通常启动Tomcat是从catalina.sh脚本或startup.sh(其实也就是catalina.sh)脚本开始的。从catalina.sh开始分析Tomcat源码,会发现其启动类是org.apache.catalina.startup.Bootstrap类。首先,作为一个启动类,解析一些启动参数,读取一些配置,这些都很正常。但再仔细看,有个问题非常奇怪:为什么很多功能只是间接调用org.apache.catalina.startup.Catalina类的类似方法,而且还要用反射的形式?
简述启动流程启动catalina.sh脚本虽然直接通过Bootstrap类启动也是可以的,但是catalina.sh脚本提供了很多默认配置和参数,省去我们很多工作。catalina.sh脚本的主要工作:
确认环境在CLASSPATH中添加bin/bootstrap.jar,这个jar包带有Tomcat的Java main方法在CLASSPATH中添加bin/tomcat-juli.jar,这个jar包含有一些启动时会用到的工具类通过jre执行bootstrap.jar中的org.apache.catalina.startup.Bootstrap类,至此启动脚本工作结束
Bootstrap类main方法被调用正如前边所说,其实Bootstrap类也只是一个包装Catalina类的“启动器”。Bootstrap类的主要工作:
读catalina.properties配置,生成三个ClassLoader——commonLoader、catalinaLoader、sharedLoader,用于加载Tomcat和Web应用需要的类通过反射获取org.apache.catalina.startup.Catalina类的实例通过反射间接调用Catalina实例的方法,启动或关闭Tomcat
commonLoader父级ClassLoader是system class loader,属于双亲委派模型中自定义的ClassLoader。用于加载CATALINA_HOME/lib/*.jar。
......
共3张