如何设置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放在你的部署描述符中。