7

我过去已经迁移到 Tomcat 7[7.0.4.1] 启动需要 5 到 7 秒现在需要 30 秒我在 web.xml 中设置的其他帖子 metadata-complete="true" 上阅读过解决了这个问题,但似乎metadata-complete="true"在我的情况下没有解决我已经添加WEB-INF/web.xml并且tomcat/conf/web.xml似乎都不起作用。

这是代码tomcat/conf/web.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
metadata-complete="true"
version="3.0">

这是代码WEB-INF/web.xml

<web-app metadata-complete="true" version="3.0"  xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

部署成功这里是tomcat正在打印的跟踪。

INFO: Starting Servlet Engine: Apache Tomcat/7.0.41
jul 22, 2013 4:33:08 PM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath

在这句话中需要超过 30 秒..

INFO: Starting Servlet Engine: Apache Tomcat/7.0.41

我的问题是:

  • 我做错了什么?

  • 我怎么能看到 metadata-complete 设置为 true 我正在其他网站上阅读这可以检查标志isMetadataComplete()但我的问题是我在哪里或如何调用这个方法?

我们在项目中使用[Spring,Hibernate,ZK]

4

2 回答 2

9

元数据完成也没有解决我的启动时间问题。问题是 tomcat 在启动时会扫描多个(几乎所有 jar)以查找注释和 tld 文件。当然,并不是所有的 jars 都包含 tld 文件和注解。为了缩短启动时间,您可以排除这些 jar。像下面这样的东西应该可以解决问题:调整 conf/catalina.properties:

org.apache.catalina.startup.ContextConfig.jarsToSkip=*.jar

# 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.
# The following list will make sure stuff like jstl and spring-webmvc.jar etc which contain tld files are included
org.apache.catalina.startup.TldConfig.jarsToSkip=a*.jar,b*.jar,c*.jar,d*.jar,e*.jar,f*.jar,g*.jar,h*.jar,i*.jar,jc*.jar, jd*.jar, je*.jar, jl*.jar, jo*.jar, JO*.jar, jr*.jar, jso*.jar, jsr*.jar, jts*.jar,k*.jar,l*.jar,m*.jar,n*.jar,o*.jar,p*.jar,q*.jar,r*.jar,spring-a*.jar, spring-c*.jar, spring-e*.jar, spring-j*.jar, spring-s*.jar, spring-test*.jar, stax*.jar, st*.jar, t*.jar,u*.jar,v*.jar,w*.jar,x*.jar,y*.jar,z*.jar
于 2013-09-14T18:43:01.863 回答
1

对于那些可能仍然像我一样遇到这个问题的人(在迁移到 Java 8 和从 Spring 3.0 到 3.2 时),请注意,如果您使用的任何 jar 包含一个web-fragment.xml(如 spring-web),您也会遇到这个问题。

absolute-ordering为了避免这种情况,您还应该在您的web.xml(根据SPRING-10196和 Tomcat 的HowTo/FasterStartUp )中指定一个空:

<absolute-ordering/>

(还要确保在 web.xml 中指定 servlet 3.0)

absolute-ordering此外,如果您使用的是旧版本的 Tomcat,由于错误 54262,空的将不起作用。要解决此问题,请使用虚拟片段名称:

<absolute-ordering>
    <!-- Due to a bug in Tomcat 7.0.29, an empty absolute-ordering does not prevent the annotation scanning.
    Adding a dummy fragment name does the trick.
    see proposed workaround in https://bz.apache.org/bugzilla/show_bug.cgi?id=54262#c0 -->
    <name>dummy</name>
</absolute-ordering>

如果没有任何效果,请考虑jarsToSkip@Prashant 提出的解决方案,但这更烦人,因为它需要修改所有环境中的 Tomcat 配置。

(由于我在 Java 8 上使用的是旧版本的 Tomcat,注释处理对我来说完全被破坏了,在启动时会出现很多异常)

于 2015-06-25T14:16:37.640 回答