Jetty 12部署Jakarta EE应用:类找不到与CDIProvider异常排查
问题排查与解决方案
核心问题分析
Jetty 12采用模块化架构,默认仅启用基础模块,WebSocket、CDI、Faces等Jakarta EE特性需手动启用对应模块;你添加的tyrus-standalone-client会与Jetty自带的WebSocket实现冲突,进而引发后续CDI加载异常。
步骤1:移除冲突依赖
删除pom.xml中的tyrus-standalone-client依赖——Jetty自带WebSocket服务器实现,无需引入第三方WebSocket依赖,该依赖会干扰Jetty的类加载逻辑。
步骤2:配置Jetty 12模块(start.ini)
在Jetty的start.ini中添加以下模块,确保WebSocket、CDI、Faces的Jakarta EE 10实现被正确启用:
# 启用Jakarta EE 10核心配置 --module=ee10-core-profile # 启用WebSocket服务器(Jakarta EE 10版本) --module=websocket-jakarta-server # 启用CDI基础模块与Weld实现(Jetty官方推荐的CDI容器) --module=cdi-jakarta --module=weld-jakarta # 启用Jakarta Faces(Mojarra实现) --module=jsf-jakarta # 若项目使用JSP,添加此模块 --module=jsp-jakarta
步骤3:调整项目pom.xml依赖
确保依赖的scope正确,避免与Jetty模块提供的API冲突:
<!-- CDI API:由Jetty cdi-jakarta模块提供,设为provided --> <dependency> <groupId>jakarta.enterprise</groupId> <artifactId>jakarta.enterprise.cdi-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- Jakarta Faces API:由Jetty jsf-jakarta模块提供,设为provided --> <dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.faces</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- 其他业务依赖按需保留,确保无重复的Jakarta EE API依赖 -->
验证步骤
- 重新打包WAR包(确认已移除tyrus依赖)
- 重启Jetty服务器,检查启动日志中是否包含
websocket-jakarta-server、weld-jakarta、jsf-jakarta等模块加载记录 - 部署WAR包,访问项目验证功能正常
内容的提问来源于stack exchange,提问作者madx
相关产品推荐
相关产品推荐

