maven的jakarta项目直接运用jetty插件运行
Apache Maven 官方的 tomcat-maven-plugin 项目在 2.2 版本后就停止了维护,并且它只支持到 Tomcat 9 (使用 javax.servlet API)。它不支持 Tomcat 10/11
現在使用maven 开发 和 学习 jsp & servlet 应用更推荐Jetty Maven Plugin
一、插件介绍
Jetty Maven Plugin 是用于快速开发和测试Web应用的Maven插件,它能够:
- 自动编译和部署Web应用
 - 支持热部署(代码修改后自动更新)
 - 提供轻量级的Web服务器环境
 
二、基本配置
1. 添加插件到pom.xml
在项目的pom.xml文件中添加以下配置:
<plugins><plugin><groupId>org.eclipse.jetty</groupId><artifactId>jetty-maven-plugin</artifactId><version>11.0.26</version><configuration><scanIntervalSeconds>10</scanIntervalSeconds><httpConnector><port>8080</port><host>localhost</host></httpConnector><webApp><contextPath>/myapp</contextPath></webApp></configuration></plugin></plugins>
2. 关键配置参数说明
scanIntervalSeconds: 扫描项目变更的时间间隔(秒)httpConnector: 配置服务器连接参数port: 监听端口host: 监听地址
webApp: 配置Web应用参数contextPath: 应用上下文路径
三、基本使用
1. 启动Jetty服务器
在项目根目录下运行:
mvn jetty:run 
2. 停止Jetty服务器
在运行Jetty的终端中:
- 按
Ctrl+C停止 - 或运行
mvn jetty:stop 
3. 自定义端口
如果需要使用非默认端口(8080),可以:
mvn jetty:run -Djetty.port=9999 
四、高级功能
1. 热部署配置
<configuration><scanIntervalSeconds>5</scanIntervalSeconds><stopPort>8079</stopPort><stopKey>myStopKey</stopKey>
</configuration>
2. 多Web应用支持
<configuration><webApp><contextPath>/app1</contextPath><war>${basedir}/src/main/webapp</war></webApp><webApp><contextPath>/app2</contextPath><war>${basedir}/src/main/webapp2</war></webApp>
</configuration>
五、常见问题解决
1. 端口被占用
如果出现端口被占用的情况,可以:
- 更改端口号
 - 或运行
mvn jetty:run-war使用War文件部署 
2. 类文件未更新
如果修改Java类后没有生效,可以:
- 检查
scanIntervalSeconds设置 - 确保IDE自动编译开启
 - 尝试手动运行
mvn clean jetty:run 
3. 依赖问题
确保所有必要的依赖都已正确配置,特别是Servlet API:
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope>
</dependency>
4. 确保配置文件 使用新的servlet标准
六、最佳实践
- 在开发阶段使用
jetty:run进行快速迭代 - 在测试阶段使用
jetty:run-war进行更接近生产环境的测试 - 合理设置
scanIntervalSeconds,避免频繁扫描影响性能 - 使用不同的端口号同时运行多个实例进行并行开
 
简单测试 servlet 和 jsp

| 项目 | Jetty 11 | Jetty 12 | 
|---|---|---|
| 状态 | 已结束支持 (EOL) | 稳定 (12.0.x) / 开发中 (12.1.x) | 
| Java 版本 | Java 11 | Java 17 | 
| 核心架构 | 基于 Jakarta EE 9 | 核心与 EE 解耦 | 
| Maven 插件 | jetty-maven-plugin  | 
目前在仓库里还没有找到支持最新servlet容器的maven插件.
jetty历史版本
CMD ["java", "-jar", "start.jar", "--add-modules=ee8-servlet"]
jetty12 为啥可以指定使用的servlet版本
在 Jetty 12 之前,jetty-server 核心库本身就包含了对 Servlet 容器功能的支持,这导致核心与 Web 技术耦合。Jetty 12 进行了一次大刀阔斧的重构:
- 剥离核心: 
jetty-server现在只负责最基础的 HTTP 协议处理、连接管理、线程池等。它完全不知道什么是 Servlet、JSP 或 WebSocket。 - 创建专用模块: 针对每个主要的 Jakarta EE 版本,Jetty 团队创建了独立的模块,例如:
jetty-ee8: 支持 Java EE 8 (javax.servletAPI)jetty-ee9: 支持 Jakarta EE 9 (jakarta.servletAPI, Servlet 5.0)jetty-ee10: 支持 Jakarta EE 10 (jakarta.servletAPI, Servlet 6.0)jetty-ee11: 支持 Jakarta EE 11 (jakarta.servletAPI, Servlet 6.1)
 
这些模块就像是一个“适配器”或“容器外壳”,它们实现了特定版本的 Servlet 规范,并“套”在轻量级的 jetty-server 核心之上,从而提供了一个完整的、符合该规范的 Web 容器。
因此,所谓的“支持多个版本”,实际上是“提供多个不同版本的专用容器实现”。
java -jar start.jar --add-modules=ee8-servlet
启用
ee8-servlet模块时,Jetty 自动加载其依赖项:ee8-security(安全规范)ee8-webapp(Web 应用容器)- 底层 HTTP 和线程池模块
 
隔离兼容:
各模块的类加载器隔离,避免 API 冲突(如javax.servletvsjakarta.servlet)。
📝 验证配置步骤
启动命令:
java -jar start.jar --add-modules=ee8-servlet检查生效:
- 查看控制台日志,确认模块已激活:
INFO: ee8-servlet initialized - 访问 
http://localhost:8080,若部署了 Servlet 3.1 应用则正常响应。 
- 查看控制台日志,确认模块已激活:
 部署项目: 将 WAR 包放入
${jetty.base}/webapps,Jetty 会自动识别并加载。
⚠️ 注意事项
默认版本:
不指定--add-modules时,Jetty 12 默认启用 Jakarta EE 10(Servlet 6.0)。模块名称:
必须使用 完整模块名(如ee8-servlet而非servlet)。配置冲突:
避免同时启用多个 Servlet 模块(如ee8-servlet+ee10-servlet),会导致类冲突。start.ini固化配置:
若需永久生效,在${jetty.base}/start.ini中添加:--module=ee8-servlet
🧩 低版本兼容实现示例
以下代码展示了 Jetty 12 如何通过模块化加载 Servlet 3.1 API:
// 伪代码:ee8-servlet 模块初始化 
public class EE8ServletModule {public void init(Server server) {// 1. 注册 Servlet 3.1 的 WebAppContext WebAppContext webapp = new WebAppContext();webapp.setConfigurationClasses(getEe8Configuration()); // 2. 使用隔离类加载器加载 javax.* 包 ClassLoader ee8Loader = new URLClassLoader(..., javax.servlet.Servlet.class); webapp.setClassLoader(ee8Loader); // 3. 挂载到 Server server.setHandler(webapp); }private String[] getEe8Configuration() {return new String[] {"org.eclipse.jetty.ee8.webapp.WebInfConfiguration", "org.eclipse.jetty.ee8.webapp.WebXmlConfiguration" };}
}📊 版本对照表
| 模块名称 | Servlet 版本 | 规范命名空间 | JDK 要求 | 
|---|---|---|---|
ee8-servlet | 3.1 | javax.servlet.* | Java 8+ | 
ee9-servlet | 5.0 | jakarta.servlet.* | Java 11+ | 
ee10-servlet | 6.0 | jakarta.servlet.* | Java 17+ | 
💡 总结
- 动态启用:用 
--add-modules=ee8-servlet快速激活 Servlet 3.1。 - 隔离兼容:Jetty 通过模块化类加载实现多版本共存。
 - 生产建议:在 
start.ini中固化配置,避免每次手动输入命令。 
部署时需确保 WAR 包使用
javax.servlet命名空间(Servlet 3.1 项目)且未混用 Jakarta API。
