当前位置: 首页 > news >正文

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标准

六、最佳实践

  1. 在开发阶段使用jetty:run进行快速迭代
  2. 在测试阶段使用jetty:run-war进行更接近生产环境的测试
  3. 合理设置scanIntervalSeconds,避免频繁扫描影响性能
  4. 使用不同的端口号同时运行多个实例进行并行开

简单测试 servlet 和 jsp

项目Jetty 11Jetty 12
状态已结束支持 (EOL)稳定 (12.0.x) / 开发中 (12.1.x)
Java 版本Java 11Java 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 进行了一次大刀阔斧的重构:

  1. 剥离核心jetty-server 现在只负责最基础的 HTTP 协议处理、连接管理、线程池等。它完全不知道什么是 Servlet、JSP 或 WebSocket。
  2. 创建专用模块: 针对每个主要的 Jakarta EE 版本,Jetty 团队创建了独立的模块,例如:
    • jetty-ee8: 支持 Java EE 8 (javax.servlet API)
    • jetty-ee9: 支持 Jakarta EE 9 (jakarta.servlet API, Servlet 5.0)
    • jetty-ee10: 支持 Jakarta EE 10 (jakarta.servlet API, Servlet 6.0)
    • jetty-ee11: 支持 Jakarta EE 11 (jakarta.servlet API, Servlet 6.1)

这些模块就像是一个“适配器”或“容器外壳”,它们实现了特定版本的 Servlet 规范,并“套”在轻量级的 jetty-server 核心之上,从而提供了一个完整的、符合该规范的 Web 容器。

因此,所谓的“支持多个版本”,实际上是“提供多个不同版本的专用容器实现”。


java -jar start.jar --add-modules=ee8-servlet

  1. 启用 ee8-servlet 模块时,Jetty 自动加载其依赖项:

    • ee8-security (安全规范)
    • ee8-webapp (Web 应用容器)
    • 底层 HTTP 和线程池模块
  2. 隔离兼容
    各模块的类加载器隔离,避免 API 冲突(如 javax.servlet vs jakarta.servlet )。


📝 验证配置步骤

  1. 启动命令

    java -jar start.jar  --add-modules=ee8-servlet 
    
  2. 检查生效

    • 查看控制台日志,确认模块已激活:
      INFO: ee8-servlet initialized 
      
    • 访问 http://localhost:8080,若部署了 Servlet 3.1 应用则正常响应。
  3. 部署项目: 将 WAR 包放入 ${jetty.base}/webapps ,Jetty 会自动识别并加载。


⚠️ 注意事项

  1. 默认版本
    不指定 --add-modules 时,Jetty 12 默认启用 Jakarta EE 10(Servlet 6.0)

  2. 模块名称
    必须使用 完整模块名(如 ee8-servlet 而非 servlet)。

  3. 配置冲突
    避免同时启用多个 Servlet 模块(如 ee8-servlet + ee10-servlet),会导致类冲突。

  4. 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-servlet3.1javax.servlet.*Java 8+
ee9-servlet5.0jakarta.servlet.*Java 11+
ee10-servlet6.0jakarta.servlet.*Java 17+

💡 总结

  • 动态启用:用 --add-modules=ee8-servlet 快速激活 Servlet 3.1。
  • 隔离兼容:Jetty 通过模块化类加载实现多版本共存。
  • 生产建议:在 start.ini 中固化配置,避免每次手动输入命令。

部署时需确保 WAR 包使用 javax.servlet 命名空间(Servlet 3.1 项目)且未混用 Jakarta API。

http://www.dtcms.com/a/564995.html

相关文章:

  • 建设外贸网站哪家好网页制作流程视频
  • Java-166 Neo4j 安装与最小闭环 | 10 分钟跑通 + 远程访问 Docker neo4j.conf
  • 如何建立小企业网站wordpress图片上传地址修改
  • 【开题答辩过程】以《基于SpringBoot的中国传统文化推广系统的设计与实现》为例,不会开题答辩的可以进来看看
  • QML笔记
  • Android 在屏幕的右下角添加客户Logo
  • linux服务-frp内网穿透工具
  • 宣城高端网站建设延吉网站开发
  • Springboot+BannerBanner(启动横幅)
  • 护照阅读器:公安安全检查的科技新助力
  • 网站支持ipv6做哪些改造余姚响应式网站建设
  • 建自己的网站多少钱网页设计与网站建设分析
  • Java 大视界 -- Java 大数据机器学习模型在自然语言处理中的对抗训练与鲁棒性提升
  • Go语言设计模式:中介者模式详解
  • 使用Spring Boot、Spring AI、MongoDB Atlas 向量搜索和 OpenAI 构建 RAG 应用
  • 数据结构——三十七、关键路径(王道408)
  • 嵌入式软件的几种程序架构
  • 网站开发适合女生吗网页设计程序代码
  • 某游戏大厂的常用面试问题解析:Netty 与 NIO
  • 网站建设去哪可接单做押韵句子的网站
  • Memos:一款不打扰的笔记工具,使用cpolar远程后体验再升级
  • Uni APP中关于Android原生插件UniComponent的使用
  • Hadess零基础学习,如何管理Docker制品
  • 石家庄购物网站排名网站检测器
  • 《嵌入式硬件(二十):基于IMX6ULL的LCD操作》
  • 日志系统设计 与 策略模式实现
  • 电子规划书商务网站建设城市分站cms
  • 【android驱动开发十三】内核常见的十种死机类型
  • Flutter 移动端性能优化指南:内存、电量与 UI 渲染
  • 广告网站建设网wordpress登录更改域名后