如何设置metadata-complete =“true”(解决了Tomcat 7启动缓慢)之后的注释?

似乎缓慢的Tomcat 7启动问题可以通过在web.xml中将“metadata-complete”设置为“true”来解决,如下所示:

<?xml version="1.0" encoding="UTF-8"?> <web-app metadata-complete="true" id="WebApp_ID" version="3.0"... 

问题是Tomcat在启动时扫描注解,这显着降低了速度。 我的时间从25秒减less到5秒。 (更多信息: Tomcat和Servlet 3.0 Webconfiguration )

但是,我在我的代码中有一些注释,如:

 @ManagedBean @RequestScoped @Override ... 

我很困惑 – 将我的代码工作后,我已经设置元数据完整=“真”? 我必须删除注释并将所有内容移到web.xml中吗?

启动缓慢是因为/WEB-INF/lib中每个JAR文件中的每个类文件都被扫描了Servlet 3.0特定的注释。 你显然在/WEB-INF/lib有很多(很大的)JAR文件。

metadata-complete="true"表示/WEB-INF/lib中的JAR文件不需要扫描Servlet 3.0特定的注释,但是webapp自己的类仍然会被扫描。

请注意,您列出了两个JSF注释和一个Java SE注释,而不是任何Servlet 3.0注释。 Servlet 3.0注释在javax.servlet.annotation包中列出。 当JAR文件包含JSF 2.0兼容/META-INF/faces-config.xml文件时,JSF将只扫描注释。 它不会立即扫描每个JAR文件中的每个类。 Java SE @Override注释不是运行时注释,而只是编译时帮助。

也可以看看:

  • 在JAR中打包Facelets文件(模板,包含,合成)

以下是Java Servlet 3.0 / 3.1规范必须说的:

Web应用程序部署描述符在web-app元素上包含元数据完整属性。 metadata-complete属性定义web.xml描述符是否完整,或者是否应该考虑部署过程使用的其他元数据源。 元数据可能来自web.xml文件, web-fragment.xml文件, WEB-INF / classes中类文件的注释,以及WEB-INF / lib目录中jar文件中的类的注释。 如果元数据完整设置为“true”,则部署工具仅检查web.xml文件,并且必须忽略应用程序的类文件中存在的@WebServlet@ WebFilter@WebListener等注释,还必须忽略web-fragment.xml描述符打包在WEB-INF / lib的jar文件中。 如果未指定metadata-complete属性或将其设置为“false”,则部署工具必须检查类文件和web-fragment.xml文件的元数据,如前所述。

这是说,并回答你的问题:是的,为了优化Tomcat的启动时间,你需要使用metadata-complete="true"并把每个Servlet或Filter或Listener放在你的部署描述符中。