升级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
相关产品推荐
相关产品推荐

