启动期间 Tomcat 中缺少时间。启动速度

Missing time in Tomcat during startup. Startup speed

我的 tomcat 应用程序在 lib 文件夹下有 20 个 .jar。启动大约需要 8 秒。 我很受伤,有什么方法可以让它更快启动吗?

所以我设置了 tomcat 的日志记录级别以查看发生了什么。 我发现 WebappLoader STARTED 日志和 StandardWrapper INITIALIZING 之间有 4 秒。

有谁知道中间发生了什么?没有办法让它更快地加载 20 个 .jar 吗?

下面是日志记录:

01-Jul-2021 22:45:04.390 FINE [localhost-startStop-1] org.apache.catalina.util.LifecycleBase.setStateInternal Setting state for [WebappLoader[/test]] to [STARTED]

01-Jul-2021 22:45:08.220 FINE [localhost-startStop-1] org.apache.catalina.util.LifecycleBase.setStateInternal Setting state for [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/test].StandardWrapper[default]] to [INITIALIZING]

有关 Tomcat 启动优化的完整指南可在 Apache's wiki 上找到。

在日志记录之间的 4 秒内 Tomcat:

  1. 加载 /WEB-INF/web.xml 并扫描应用程序 jar 以查找 META-INF/web-fragment.xml 条目。这非常快,但您可以通过配置 JarScanFilter 或使用系统属性对其进行优化:
# Default value of `pluggabilitySkip`
tomcat.util.scan.StandardJarScanFilter.jarsToSkip
# Default value of `pluggabilityScan`
tomcat.util.scan.StandardJarScanFilter.jarsToScan
  1. 寻找 ServletContainerInitializer。这应该也很快,但是会影响下一步。您可以限制在 web.xml.

    中使用 <absolute-ordering> 元素找到的 SCI 列表

    Websocket API 和 JSP API 使用的 SCI 无法通过这种方式禁用,需要使用 [=19] 的 containerSciFilter 属性=]元素:

<!-- Disables both SCIs -->
<Context containerSciFilter="WsSci|JasperInitializer" />
  1. 最重的部分是在您的应用程序中扫描 class 个文件。将扫描文件夹 WEB-INF/classes 和在步骤 1 中找到的所有带有 web-fragment.xml 的 jar。要禁用扫描,您需要将属性 metadata-complete="true" 添加到 web.xml 描述符 禁用所有 SCI(或者只保留像 Jasper 这样不扫描的 SCI注释)。

大部分魔法都发生在 ContextConfig#webConfig 方法中,该方法有很好的评论。