项目上最近要把内置的jetty换成tomcat, 来更好的支持servlet 3.0
本来以为换个容器, 几十行代码就好了. 实际上换了tomcat后, 一开始启动tomcat, 非常的慢.
jetty只要几秒就可以启动的web工程, 内嵌tomcat花了接近15s, 直接启动tomcat, 接近10s.
后来试了下, 删除了项目里的web.xml, 发现直接启动tomcat只要0.6s, 而内嵌tomcat居然要5s.
这就很奇怪了, 因为web工程里既没有WEB-INF/lib, 也没有web.xml, 这多出来的5s来源何处.
对比了直接启动和内嵌启动的日志, 发现有一些日志不一样.
org.apache.catalina.startup.ContextConfig getDefaultWebXmlFragment
信息: No global web.xml found
把源码倒腾下来, 搜索No global web.xml found, debug进去看,
发现在ContextConfig中有个webConfig方法, 里面有个扫描jar里class,
匹配注解来加载fragments. 他会扫描WEB-INF/lib以及classpath, jdk路径下的jar来匹配需要的类.
就是这个导致内嵌的tomcat启动速度低于直接启动, 我们业务用不到, 注释掉后, 速度跟直接启动差不多了.