共计 1614 个字符,预计需要花费 5 分钟才能阅读完成。
Tomcat 启动核心流程解析
一、Bootstrap 主入口架构
Java 应用入口机制 在 Tomcat 中体现为 Bootstrap 类的 main 方法,该入口位于 catalina.startup 包路径。启动过程包含三个关键环节:
1. 通过静态代码块配置 catalinaHome 与catalinaBase路径
2. 构建三级类加载器体系
3. 反射生成 Catalina 实例
二、环境路径配置原理
static {
// 通过系统属性获取安装路径
String home = System.getProperty(Globals.CATALINA_HOME_PROP);
File homeFile = new File(home).getCanonicalFile();
// 自动检测 bootstrap.jar 定位基准路径
if(!bootstrapJar.exists()){homeFile = new File(userDir).getParentFile();}
System.setProperty(Globals.CATALINA_BASE_PROP, baseFile.getPath());
}
多实例部署方案 通过分离安装目录与工作目录实现:
– catalinaHome 存放共享的 bin/lib 目录
– catalinaBase 保存实例专属的 conf/webapps 等配置
三、分层类加载体系
类加载器初始化流程:
private void initClassLoaders() {commonLoader = createClassLoader("common", null);
catalinaLoader = createClassLoader("server", commonLoader);
sharedLoader = createClassLoader("shared", commonLoader);
Thread.currentThread().setContextClassLoader(catalinaLoader);
}
类加载器作用域:
– CommonLoader:加载 $CATALINA_HOME/lib 公共库
– CatalinaLoader:隔离 Tomcat 核心模块
– SharedLoader:服务 Web 应用公共依赖
四、Catalina 启动引擎
通过反射机制实例化 Catalina 类:
Class> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
Object instance = startupClass.getConstructor().newInstance();
Method startMethod = instance.getClass().getMethod("start");
startMethod.invoke(instance);
五、XML 解析与组件初始化
Catalina 通过 Digester 解析 server.xml 构建组件树:
protected Digester createStartDigester() {digester.addObjectCreate("Server", "org.apache.catalina.core.StandardServer");
digester.addSetProperties("Server");
digester.addSetNext("Server", "setServer");
// 其他组件创建规则...
}
启动过程中完成:
1. 读取 conf/server.xml 配置文件
2. 构建 Server/Service/Connector 组件层级
3. 执行各组件生命周期初始化
六、组件启动时序
最终通过反射调用 Catalina.start()方法:
1. 创建 Digester 解析器
2. 加载 server.xml 配置
3. 初始化命名服务
4. 启动 Server 及子组件
5. 记录启动耗时统计