我的应用程序非常庞大,包含例如web-inf / lib中的310个jar,总共100Mb。启动服务器,此步骤需要13秒:
Sep 16, 2014 1:05:33 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\apache-tomcat-7.0.47\webapps\ROOT
应用程序依赖于Web片段和注释来正确启动。
我尝试了以下操作来跳过13s的扫描时间:
修改conf/context.xml with attribute logEffectiveWebXml="true"
catalina run 2> web-complete.log
从web.xml
中提取web-complete.log
代码段,并将其保存在webapps\ROOT\web-inf\web.xml
如果我开始申请,我仍然会看到13秒的扫描时间。在上面的snipet中,metadata-complete已经设置为“true”。
将以下语句添加到web.xml后,完全跳过13s,但这次我的应用程序无法启动:
<absolute-ordering />
1)在我的情况下,让tomcat快速启动的正确方法是什么?
2)你能解释为什么元数据完整对13s没有帮助吗?
3)尽管我的web.xml已经完成,为什么不允许应用启动?
谢谢,
答案 0 :(得分:8)
您可能认为默认情况下,Tomcat在部署您的Web应用程序时执行的操作效率低下,如果您做出正确的更改,您可以克服它并使您的Web应用程序更快地启动。这些都不是安全的假设。 Tomcat往往非常高效,甚至可以处理大型Web应用程序。
听起来像你的webapp足够大,JDK无法加载大量的类,并在13秒内实现大量的对象。时间可能主要用于实例化和初始化servlet及其所需的所有内容,如果您的webapp在提供请求之前有许多大型子系统要初始化,那么这是一项非常大的工作。完成所有这些操作肯定需要几十秒,在此期间,解析配置文件的时间不多,甚至打开JAR来查找和解析一些文件。
为什么你的webapp无法以静态元数据完整部署描述符开始,我不知道,部分原因是你没有说出它失败时失败的具体方式。但是,通过将metadata-complete设置为true,您可能绕过了webapp所依赖的webapp启动的必要部分。
潜在的启动优化
您可能专门为大型Web应用程序配置的可以节省Tomcat大量时间查看Web应用程序文件的内容是:跳过您知道Tomcat不应扫描某些内容的JAR,例如Servlet 3片段和TLD。看看你的Tomcat的conf / catalina.properties文件..这些可配置的系统属性在那里:
# Additional JARs (over and above the default JARs listed above) to skip when
# scanning for Servlet 3.0 pluggability features. These features include web
# fragments, annotations, SCIs and classes that match @HandlesTypes. The list
# must be a comma separated list of JAR file names.
org.apache.catalina.startup.ContextConfig.jarsToSkip=
# Additional JARs (over and above the default JARs listed above) to skip when
# scanning for TLDs. The list must be a comma separated list of JAR file names.
org.apache.catalina.startup.TldConfig.jarsToSkip=tomcat7-websocket.jar
添加Tomcat搜索这些JAR时应该跳过的所有JAR,我的猜测是Tomcat启动webapp的部分将更快完成。提前多久取决于webapp。
答案 1 :(得分:1)
回答我自己的问题:
2)你能解释为什么将metadata-complete设置为true无助于减少13s吗?
元数据完整属性不直接控制类注释扫描。它控制是否会发现网络片段,然后反过来扫描这些片段中包含的类。
如果在&lt; absolute-ordering&gt;中启用了相同的网络片段(或留空),ServletContainerInitializer.onStartup(Set&gt;,ServletContext)将独立于metadata-complete的值接收同一组带注释的类。
因此,改变元数据完整性的价值本身不会对爆炸战争部署/类扫描产生影响。只有在指定了webfragments时才会发生更改。
作为副作用,不会扫描不属于网络片段的jars,这可能会导致TLD中带注释的类的问题。因此,重要的是应用程序的所有组件都是Web片段,以便从此优化中受益。
3)尽管我的web.xml已经完成,为什么它不允许应用启动?
使用选项logEffectiveWebXml =&#34; true&#34;在conf / context.xml上设置,只记录侦听器和过滤器。未指定ServletContainerInitializers(SCI)。
如果&lt; absolute-ordering&gt;未在web.xml中设置,SCI将作为Web片段扫描的一部分被发现。如果它在上面的示例中设置为空,则将跳过所有Web片段,因此应用程序将无法启动。