43

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

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

问题是 Tomcat 在启动时会扫描注释,这会大大减慢它的速度。我的时间从 25 秒缩短到 5 秒。(更多信息:Tomcat 和 Servlet 3.0 Web 配置

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

@ManagedBean
@RequestScoped
@Override
...

我很困惑 - 在我设置 metadata-complete="true" 后我的代码会工作吗?我是否必须删除注释并将所有内容移动到 web.xml 中?

4

2 回答 2

73

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

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

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

也可以看看:

于 2012-03-22T10:49:04.170 回答
14

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

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

话虽如此并回答您的问题:是的,为了优化 Tomcat 的启动时间,您需要使用metadata-complete="true"并将每个 Servlet 或 Filter 或 Listener 放入部署描述符中。

于 2015-01-31T12:51:26.393 回答