Tomcat源码阅读之Host启动
来源:互联网 发布:spss怎样筛选数据 编辑:程序博客网 时间:2024/06/07 02:35
在Tomcat中,web应用程序会用Context实例表示,要运行Context实例,一般会把它部署到Host容器里。在部署web应用程序的时候既可以采用war包的方式部署,也可以将web应用程序的整个目录复制到webapps目录下。部署web程序是Host容器启动过程中非常重要的步骤。
Host容器的监听器是HostConfig,当调用Host容器的start方法进行启动的时候会触发start事件,HostConfig监听器会调用自身的start方法处理这个事件,但主要进行逻辑处理的方法是deployApps,该方法会逐个部署指定目录中的所有web应用程序。
protected void deployApps() { File appBase = appBase(); File configBase = configBase(); String[] filteredAppPaths = filterAppPaths(appBase.list()); // Deploy XML descriptors from configBase deployDescriptors(configBase, configBase.list()); // Deploy WARs, and loop if additional descriptors are found deployWARs(appBase, filteredAppPaths); // Deploy expanded folders deployDirectories(appBase, filteredAppPaths); }
Host容器对应的目录默认是webapps,当然这个目录名称是可以通过server.xml进行修改的,在Tomcat中,web应用程序默认部署在webapps目录下,webapps目录下的每个目录都是一个Context实例,Host容器会依次启动所有的Context实例,这个过程就是部署。deployApps中三个方法deployDescriptors,deployWARs,deployDirectories作用分别是部署描述符文件,部署war包和部署目录。其中描述符文件是指web程序的xml配置文件。
根据部署的顺序首先来看部署配置文件的过程。
以部署配置文件/conf/Catalina/localhost/host-manager.xml为例。部署host-manager.xml的时候,控制台会有相应的日志信息输出。信息: Deploying configuration descriptor host-manager.xml然后会根据配置文件生成StandardContext对象,实例化监听器ContextConfig,并添加到Host容器中。最后保存配置文件的最后修改时间,在动态部署的时候会根据该文件的时间戳与保存的时间进行比较,如果时间戳大于保存的时间,则说明该配置文件被修改过,会重新部署该Context实例。
接着看部署war包的过程。
部署war包的时候控制台也会有相应的日志信息输出信息: Deploying web application archive travel.war,然后会根据包名生成对应的Context实例,实例化监听器ContextConfig并添加到Host容器中。但Tomcat无法直接运行压缩文件,因此需要解压war包。解压的时候先将war包转成jar包,然后通过JarFile和JarEntry两个类,将jar包中的内容读取出来并写入文件。war包解压完之后,webapps目录下会多一个同名的文件夹。当Tomcat再次启动的时候,首先会去webapps是否有跟war包同名的文件夹,有的话则说明war已经解压过,并不需要再次解压,不再执行解压步骤,直接返回。war包的最后修改时间也会被保存起来,作用就是判断war包是否被修改过,如果被修改过,则会重新部署该war包。
最后是部署目录。
进行目录部署的时候,程序会遍历webapps目录下所有的目录,并逐个依次进行部署。但是注意一点,因为war包在解压完之后就会部署对应的目录,因此在这个过程中并不会部署跟war包同名的目录。部署完目录之后会记录每个目录的最后修改时间,根据最后修改时间和时间戳进行比较,如果有目录被修改了则会重新部署该目录。
- Tomcat源码阅读之Host启动
- Tomcat源码阅读之Engine启动过程
- Tomcat源码阅读之Context启动
- Tomcat源码阅读之Connector启动
- Tomcat源码阅读之Bootstrap启动流程与classLoader设计
- Tomcat源码阅读之过滤器
- tomcat源码阅读之Digester
- Tomcat源码阅读之StandarWrapper源码分析
- Tomcat源码阅读之Server.xml文件的处理与Catalina启动流程
- Tomcat源码阅读之Server.xml文件的处理与Catalina启动流程
- Tomcat源码阅读之Mapper分析
- Tomcat源码阅读之Init过程
- Tomcat源码阅读之Load过程
- Tomcat源码阅读之实例化Container
- Tomcat源码阅读之初始化Server组件
- Tomcat源码阅读之初始化连接器组件
- Tomcat源码阅读之请求过程
- Tomcat源码阅读之处理请求
- JAVA8 十大新特性详解
- 【设计模式】-代理模式
- POJ 2549(中间相遇)
- 全面认识电子现金、电子钱包、qPBOC、闪付、UPCash
- C/C++ 创建windows系统服务程序
- Tomcat源码阅读之Host启动
- android 常用ActionBar分析
- java中的运算符
- Hdu-3709 Balanced Number(数位DP)
- 网易有道编程题:恢复队列
- select下拉框有了空行怎么办
- Android Training--Capture Photos
- Andriod之132个最佳问题
- Matlab 2014b在Ubuntu14.04安装