Tomcat8源码笔记(八)明白Tomcat怎么部署webapps下项目

      之前没想过这么个问题:Tomcat怎么处理webapps下项目,而且我访问浏览器ip: port/项目名/请求路径,以SSM为例,Tomcat怎么就能将请求找到项目呢,项目仍是个文件夹类型的?html

 

      Tomcat部署webapps下项目方法位于:HostConfig#deployApps,别问怎么知道的,看源码,也能够支持看下我前面的博客,虽然介绍粗心大意,可是也能走到这步了。web

介绍下deployApps,最开始获取两个配置,分别是catalina-home/webapps以及catalina-home/conf/Catalina/localhost路径,filterAppPaths方法呢主要是过滤webapps下不想部署的项目,好比你有些大项目之前部署的,如今不想用了,可是不想删除呢?就能够忽略部署来节省Tomcat启动时间,具体方式就是在server.xml中Host元素里添加属性deployIgnore,支持正则表达式过滤。正则表达式

deployDescriptors、deployWARs是部署特定类型的项目,好比war包等,这里主要介绍的是deployDirectories,有兴趣的能够自行研究另外两种.apache

image

 

     那咱们明白了Tomcat部署项目仍是得靠deployDirectories方法.浏览器

HostConfig#deployDirectories方法以下,思路清晰,先介绍个大致,webapps下每一个项目,只要是文件夹的(名字不为META-INF\WEB-INF)的,都会经过多线程的方式去”部署项目”,(这里须要说起一点,怕引发误会,这里Tomcat默认给配置的ExecutorService初始线程个数、最大线程个数都是1,这个就尴尬了,是啥缘由引发的无从而就,若是调大个数是否能提升销量有待确认!)下面开始一点点介绍这个“部署”过程.tomcat

image

 

第一步,介绍ContextName实例化

    name是webapps下各个文件夹类项目的名字,FWD_SLASH_REPLACEMENT就是 # ,VERSION_MARKER就是 ## , 代码比较简单,直接看结果,好比webapps下doc目录,最后获得的四个属性值结果就是 baseName就是docs ,version就是 “”,path就是 /docs ,name就是 /docs , 其余正常项目名不含#都是相似,举两个个例:Root目录,baseName是Root,version就是“” , path就是 “”, name就是 “”  .多线程

image

 

 

第二步.线程来调用DeployDirectory完成部署

DeployDirectory是HostConfig内部类,实现了Runnable,持有三重要属性:HostConfig--外部类实例,ContextName--上面初始化的上下文名称类,File---当前webapps下目录的File句柄app

run方法是核心,一看还不是调用HostConfig#deployDirectory!webapp

image

第三步. HostConfig#deployDirectory部署项目

代码比较长,分红片断来记录:  前几行打印日志,就是Tomcat常见到的日志以下.  而后  xml文件引用指向 webapps下当前正在部署的项目(暂叫A吧),xml指向A项目META-INF/content.xml文件,而xmlCopy指向 catalina-home/conf/Catalina/localhost/A.xml,copyThisXml默认是false,deployThisXML默认是true.ui

Deploying web application directory E:\Tomcat_Source_Code\apache-tomcat-8.0.53-src\catalina-home\webapps\docs

image 代码片断二. 截取了try-catch块前半段, 因为deployThisXML默认是true,可是咱们假设content.xml不存在的状况,就会执行if判断逻辑最后一段,contextClass默认是StandardContext,因此实例化了一个StandardContext!

image

代码片断三. try-catch块后半段逻辑:configClass默认是ContextConfig,是个Tomcat的监听器,实例化后在StandardContext上监听着,此外StandardContext赋值四个ContextName的属性.

而后将StandardContext和StandardHost关联起来!  代码片断四.finally块作了一些收尾工做,这个留待时候再分析,先分析StandardContext与StandardHost的关联!

image

StandardHost和StandardContext关联起来步骤比较复杂!

  先判断是否webapps是否有项目名解析以后name同样的,抛出异常来不容许这样作!将StandardContext父类设置为StandardHost,将StandardContext做为value,项目名name做为key存入StandardHost的 children属性中(这也说明StandardHost的getChildren确定是调用children.values()来获取);   部署一个项目以后就会调用项目StandardContext#start方法,项目启动以后触发对应监听事件.  StandardContext#start简单分析见这里,Tomcat8源码笔记(九)组件StandardContext启动流程--未完待续 

image

代码片断四.finally块

部署完成以后,最终达成这样的效果,将部署信息存放在HostConfig的deployed中,好比 /docs--对应部署信息.

image

大致流程粗糙的写了一遍,具体细节,类我还须要熟悉在记录吧。

相关文章
相关标签/搜索