Tomcat源码阅读之Host启动

在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包同名的目录。部署完目录之后会记录每个目录的最后修改时间,根据最后修改时间和时间戳进行比较,如果有目录被修改了则会重新部署该目录。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值