Maven 中 Jetty 与 Tomcat 插件的配置与使用
Jetty 插件集成与常用配置
在基于 Maven 的 Web 项目中,Jetty 和 Tomcat 插件可用于快速启动和调试应用。以下以 Jetty 9 版本为例,介绍其在 Maven 中的典型用法。
添加 Jetty 插件依赖
在 pom.xml 文件的 <build> 节点中加入插件声明:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.8.v20150217</version>
</plugin>
启动与停止服务
通过命令行运行:
mvn jetty:run
按 Ctrl + C 可终止服务。若希望支持远程关闭指令,需配置停止端口和密钥:
<configuration>
<stopPort>9966</stopPort>
<stopKey>shutdown</stopKey>
</configuration>
配置后可通过 mvn jetty:stop 安全关闭正在运行的服务实例。
解决静态资源锁定问题
Jetty 默认启用文件映射缓存(useFileMappedBuffer),导致开发过程中无法修改 CSS、JS 等静态文件。解决方案如下:
- 进入本地 Maven 仓库路径:
${repo}/org/eclipse/jetty/jetty-webapp/9.2.8.v20150217/jetty-webapp-9.2.8.v20150217.jar - 解压其中的
webdefault.xml文件 - 修改以下参数为
false:
<init-param>
<param-name>useFileMappedBuffer</param-name>
<param-value>false</param-value>
</init-param>
- 保存并重新打包回 JAR 文件
自定义端口
默认 HTTP 端口为 8080,可通过以下方式更改:
- 命令行指定:
mvn -Djetty.port=8081 jetty:run - 或在插件配置中设置:
<httpConnector>
<port>8081</port>
</httpConnector>
开启热部署功能
启用自动扫描机制,实现代码变更后自动重载:
<scanIntervalSeconds>2</scanIntervalSeconds>
该值大于 0 表示开启轮询检测,单位为秒。也可通过命令行传参:mvn -Djetty.scanIntervalSeconds=2 jetty:run
手动重载模式
为避免频繁触发重部署,可切换至手动加载模式:
<reload>manual</reload>
此时即使文件被修改,也不会立即生效,需在控制台按下回车键才执行重新加载,便于连续调试。
访问日志记录
启用 NCSA 格式日志输出,用于追踪请求信息:
<requestLog implementation="org.eclipse.jetty.server.NCSARequestLog">
<filename>target/access-yyyy_mm_dd.log</filename>
<filenameDateFormat>yyyy_MM_dd</filenameDateFormat>
<logDateFormat>yyyy-MM-dd HH:mm:ss</logDateFormat>
<logTimeZone>GMT+8:00</logTimeZone>
<append>true</append>
<logServer>true</logServer>
<retainDays>120</retainDays>
<logCookies>true</logCookies>
</requestLog>
日志将按日期命名并存储于 target 目录下,包含客户端 IP、请求方法、状态码、User-Agent 等信息。
启动时输出容器状态
用于诊断环境状态,可在启动时打印组件树和线程信息:
<dumpOnStart>true</dumpOnStart>
Web 应用上下文配置
设置应用上下文路径:
<webApp>
<contextPath>/${project.artifactId}</contextPath>
</webApp>
同时支持多个资源目录:
<resourceBases>
<resourceBase>${project.basedir}/src/main/webapp</resourceBase>
<resourceBase>${project.basedir}/commons</resourceBase>
</resourceBases>
引用时无需包含目录名,例如直接使用 <link href="main.css" rel="stylesheet"> 即可加载 commons/main.css。
Tomcat 插件快速集成
除了 Jetty,Maven 也支持嵌入式 Tomcat 7 运行:
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<useBodyEncodingForURI>true</useBodyEncodingForURI>
<path>/</path>
</configuration>
</plugin>
启动命令为:mvn tomcat7:run,适合需要更贴近生产环境(Tomcat)测试的场景。
综合配置示例
完整插件配置参考:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.8.v20150217</version>
<configuration>
<httpConnector>
<port>8081</port>
</httpConnector>
<stopPort>9966</stopPort>
<stopKey>shutdown</stopKey>
<reload>manual</reload>
<dumpOnStart>true</dumpOnStart>
<webApp>
<contextPath>/${project.artifactId}</contextPath>
</webApp>
<requestLog implementation="org.eclipse.jetty.server.NCSARequestLog">
<filename>target/access-yyyy_mm_dd.log</filename>
<logDateFormat>yyyy-MM-dd HH:mm:ss</logDateFormat>
<logTimeZone>GMT+8:00</logTimeZone>
<append>true</append>
</requestLog>
</configuration>
</plugin>