Jetty创业公司需要多长时间?

Joh*_*erg 8 java jetty spring-mvc maven maven-jetty-plugin

在我的Web应用程序开始加载之前,启动Jetty会有很长的延迟(8秒)

13:50:10 [INFO] jetty-9.4.5.v20170502
13:50:18 [INFO] Scanning elapsed time=146ms
Run Code Online (Sandbox Code Playgroud)

启用调试日志记录后,有两个有趣的步骤

  • 提取依赖战争应用程序,毕竟需要时间(3s)

    10:03:13 [DEBUG] Extracting entry = null from jar file:[..]/application-1.0.war
    10:03:16 [DEBUG] Unpacked overlay: jar:file:[..]/application-1.0.war!/ to file:[..]
    
    Run Code Online (Sandbox Code Playgroud)
  • 和以下4s延迟:

    10:03:16 [DEBUG] Service loaders found in 0ms
    10:03:20 [DEBUG] loaded interface javax.servlet.ServletContainerInitializer
    
    Run Code Online (Sandbox Code Playgroud)

如何调试或影响导致4s以上延迟的原因?


组态

的pom.xml

<dependency>
    <groupId>com.company</groupId>
    <artifactId>application</artifactId>
    <version>1.0</version>
    <type>war</type>
</dependency>

[...]

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.4.5.v20170502</version>
    <configuration>
        <webApp>
            <webInfIncludeJarPattern>empty</webInfIncludeJarPattern>
            <containerIncludeJarPattern>empty</containerIncludeJarPattern>
        </webApp>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

web.xml中

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
     version="3.1" 
     metadata-complete="true">

   <context-param>
       <param-name>contextClass</param-name>
       <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
   </context-param>

   <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>com.app.AnnotationConfig</param-value>
   </context-param>

   <listener>
       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>

   [...]

</web-app>
Run Code Online (Sandbox Code Playgroud)

Joa*_*elt 4

你有一个比平均水平更大的 web 应用程序(70MB 的 WEB-INF/lib jar),但没有什么特别大的(我见过 800MB 的战争文件)

发生一些事情可能会导致速度变慢。

  1. 将 war 解压到 WebApp 临时目录中
  2. 将资源 jar ( WEB-INF/lib/*.jar!/META-INF/resources/) 解压到 WebApp 临时目录中
  3. Jar 字节码扫描(针对类@HandlesType上的注释中声明的注释和类型javax.servlet.ServletContainerInitializer

如果您的文件系统很慢,那么上述任何一个都会减慢您的速度。

注意:Jetty 的 DEBUG 日志记录会告诉您每个的时间(甚至将字节码扫描时间分解为单个 jar)

字节码扫描步骤是启动时间最常受到影响的地方。

<containerIncludeJarPattern>不建议将其配置为“空”,这是 Servlet、JSP、Taglib 发挥作用所必需的。

containerIncludeJarPattern无论如何,默认值只是servlet / jsp / taglib jar。(扫描需要微秒)

也不应该只是“空”,它<webInfIncludeJarPattern>至少应该包含您的WEB-INF/classes内容(又名.*/classes/.*)。考虑将其设置为仅扫描WEB-INF/lib您需要的那些罐子。(就像是.*/lib/spring-.*\.jar$|.*/classes/.*

WEB-INF/lib/*.jar你的and中的类的大小(以字节为单位)WEB-INF/classes实际上是无关紧要的。与计时更相关的是找到的文件数量(甚至是非类文件)。

如果您使用资源 jar ( WEB-INF/lib/*.jar!/META-INF/resources/),那么这是启动缓慢的重大惩罚/根源。

你可以做什么:

首先查看您的调试日志,这将告诉您哪些地方发生了问题。

接下来,如果启动时间很重要,请研究使用quickstartJetty 的功能(这有 2 个部分,一个构建时组件,用于扫描并构建jetty-quickstart.xml包含在您的 war 中的文件,以及一个运行时模块,用于查找并使用该组件(jetty-quickstart.xml如果找到))

最后,如果您使用资源 jar ( ),请考虑在构建期间( maven 中的阶段)WEB-INF/lib/*.jar!/META-INF/resources/将这些内容移出或移入您的 war 中的正常位置。这些很方便,但有一些您似乎不喜欢的副作用。(还要考虑运行时资源解析冲突的问题)。WEB-INF/libpackage