You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Java 17与Jakarta Faces后Tomcat 11启动报错:CDI不可用求助

解决Tomcat11启动Jakarta Faces时CDI不可用的问题

问题原因

Tomcat作为Servlet容器,仅提供CDI API,不包含CDI的具体实现。你当前仅添加了CDI API包,缺少实际运行所需的CDI实现类库,导致Mojarra(Jakarta Faces的参考实现)无法找到CDI BeanManager。

解决方案

1. 添加CDI实现类库

选择以下任意一种CDI实现,将对应的JAR包放入项目的WEB-INF/lib目录:

  • Weld(JBoss出品,Jakarta EE官方推荐):下载适配Jakarta EE10的版本(如weld-servlet-shaded-5.1.1.Final.jar),该包包含所有依赖,无需额外JAR。
  • OpenWebBeans(Apache出品):需要下载openwebbeans-impl-4.0.0.jar、openwebbeans-spi-4.0.0.jar、openwebbeans-el-4.0.0.jar等核心包。

2. 配置Tomcat上下文监听器

在Tomcat的conf/context.xml或项目的META-INF/context.xml中添加CDI实现对应的监听器:

  • 若使用Weld:
    <Listener className="org.jboss.weld.environment.servlet.Listener" />
    
  • 若使用OpenWebBeans:
    <Listener className="org.apache.webbeans.servlet.WebBeansConfigurationListener" />
    

3. 清理冗余依赖

移除类路径中重复的CDI API包:

  • 删除jakarta.enterprise.cdi-api-4.1.0.jar和jakarta.enterprise.cdi-el-api-4.1.0.jar,因为Tomcat11已内置这些API,重复打包会引发类加载冲突。

4. 验证web.xml版本

确保项目的web.xml声明为Jakarta EE10兼容版本(Servlet 6.0):

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
         version="6.0">
    <!-- 你的配置 -->
</web-app>

内容的提问来源于stack exchange,提问作者snotmare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:22:03