部署JSF应用到Tomcat 9.0.80时遇FacesContextFactory异常求助
错误原因及解决方法
错误原因
这个异常核心是JSF的工厂查找机制无法找到javax.faces.context.FacesContextFactory的具体实现类,常见触发场景包括:
- JSF依赖不完整/版本不兼容:Tomcat属于轻量级Servlet容器,本身不自带JSF实现,若仅引入JSF API依赖而缺失实现包(如Mojarra/MyFaces),或依赖版本与Tomcat 9不匹配(Tomcat 9兼容JSF 2.2/2.3),会导致运行时找不到工厂类。
- 依赖范围配置错误:pom.xml中JSF依赖的
<scope>设为provided,但Tomcat本身不提供JSF支持,导致部署后运行时无可用实现。 - faces-config.xml配置异常:比如根元素的版本声明与实际依赖版本不符,或自定义了冲突的工厂配置,覆盖了默认实现。
- 类加载冲突:项目中存在多版本JSF API/实现JAR,或Tomcat的
lib目录中混入了JSF相关包,导致类加载混乱。
解决方法
1. 修正pom.xml依赖
确保引入完整的JSF实现包(以Mojarra为例),依赖范围设为compile或runtime,不要用provided:
<dependencies> <!-- JSF API --> <dependency> <groupId>javax.faces</groupId> <artifactId>javax.faces-api</artifactId> <version>2.3</version> <scope>compile</scope> </dependency> <!-- Mojarra JSF实现 --> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.faces</artifactId> <version>2.3.14</version> <scope>compile</scope> </dependency> </dependencies>
注意选择与Tomcat 9兼容的稳定版本,避免版本过高或过低。
2. 验证faces-config.xml配置
确保根元素的版本声明与引入的JSF版本一致,且无冲突的工厂配置:
<?xml version="1.0" encoding="UTF-8"?> <faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd" version="2.3"> <!-- 业务相关配置,不要添加未实现的FacesContextFactory自定义配置 --> </faces-config>
3. 检查web.xml的JSF基础配置
确保Faces Servlet配置正确:
<servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping>
4. 清理类加载冲突
- 删除项目中重复的JSF相关JAR(如同时存在Mojarra和MyFaces包)。
- 检查Tomcat的
lib目录,若存在JSF相关JAR,直接移除,避免与项目依赖冲突。
内容的提问来源于stack exchange,提问作者Python_user
相关产品推荐
相关产品推荐

