解决Maven的Jetty插件启动慢的问题

问题描述

Maven项目中使用Jetty插件,Jetty8.x以上的版本,会出现启动慢的问题。pom.xml中Jetty插件配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version>
<configuration>
<stopKey>foo</stopKey>
<stopPort>9997</stopPort>
<connectors>
<connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
<port>8090</port>
</connector>
</connectors>
</configuration>
</plugin>

执行mvn jetty:run命令启动Jetty,控制台日志截图:

日志停留在最后一行:
[INFO] No Transaction manager found - if your webapp requires one, please configure one.
很长时间后才打印出其他日志最后启动成功。

解决办法

起初以为是事务的配置问题,于是上百度按No Transaction manager found关键字搜索,果然网上有很多类似的情况,虽然给出了解决方法,但都没有说明缘由。于是,好奇心泛滥,就去Google了下。果然,问题并不在事务配置。
Jetty官网中提到Jetty会在启动时默认扫描 WEB-INF 中所有的JAR,这就是问题的原因所在了。那么为了解决这个问题,我们需要修改配置,告诉Jetty哪些JAR需要扫描,哪些不需要。配置方法如下:

第一步:修改Maven的pom.xml关于jetty插件的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version>
<configuration>
<stopKey>foo</stopKey>
<stopPort>9997</stopPort>
<contextXml>src/main/resources/jetty-context.xml</contextXml> <!-- 添加这一行 -->
<connectors>
<connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
<port>8090</port>
</connector>
</connectors>
</configuration>
</plugin>

在原有的基础上加上一行<contextXml>src/main/resources/jetty-context.xml</contextXml>(这里的jetty-context.xml目录可以修改成你项目中需要的)

第二步:在前一步约定的目录下新建一个jetty-context.xml文件,并写入如下配置:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg>
<Arg>.*/mwa-web-.*\.jar$</Arg> <!-- 这里用正则配置你需要jetty启动时扫描的JAR -->
</Call>
</Configure>

上面例子是只扫描mwa-web-开头的JAR,如果有多个,用正则的|分隔,如:

1
<Arg>.*/mwa-web-[^/]*\.jar|.*/swagger-[^/]*\.jar$</Arg>

坚持原创技术分享,您的支持将鼓励我继续创作!