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

时间:2017-08-09 12:14:23

标签: java maven spring-mvc jetty maven-jetty-plugin

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

13:50:10 [INFO] jetty-9.4.5.v20170502
13:50:18 [INFO] Scanning elapsed time=146ms

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

  • 提取依赖的war-application,毕竟花费时间(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:[..]
    
  • 以及以下4s延迟:

    10:03:16 [DEBUG] Service loaders found in 0ms
    10:03:20 [DEBUG] loaded interface javax.servlet.ServletContainerInitializer
    

如何调试或影响导致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>

的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>

1 个答案:

答案 0 :(得分:3)

你有一个更大的平均webapp(70MB的WEB-INF / lib罐子),但没有什么大的(我已经看过800MB战争文件)

有一些事情可能导致减速。

  1. 将战争解压缩到WebApp临时目录
  2. 将资源罐(WEB-INF/lib/*.jar!/META-INF/resources/)解压缩到WebApp临时目录
  3. Jar字节码扫描(用于@HandlesTypejavax.servlet.ServletContainerInitializer注释中声明的注释和类型)
  4. 如果您的文件系统很慢,那么上述任何一种情况都会让您失望。

      

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

    字节码扫描步骤是启动时间最常见的地方。

    为&#34;空&#34;配置<containerIncludeJarPattern>不推荐使用,这是Servlet,JSP,Taglibs运行所必需的。

    无论如何,

    The containerIncludeJarPattern default只是servlet / jsp / taglib jars。 (需要几微秒才能扫描)

    <webInfIncludeJarPattern>也不应只是&#34;空&#34;,它至少应包含您的WEB-INF/classes内容(又名.*/classes/.*)。考虑将其设置为仅扫描您需要的WEB-INF/lib个罐子。 (类似于.*/lib/spring-.*\.jar$|.*/classes/.*

    WEB-INF/lib/*.jarWEB-INF/classes中类的字节大小实际上是无关紧要的。与时间更相关的是找到的文件数量(甚至是非类文件)。

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

    你能做什么:

    首先查看你的DEBUG日志,它会告诉你事情的发展时间。

    接下来,如果启动时间很重要,请使用Jetty的quickstart功能进行调查(这有两个部分,一个构建时组件,用于扫描和构建战争中包含的jetty-quickstart.xml,以及运行时模块,查找并使用jetty-quickstart.xml(如果找到)

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