如何在Apache Tomcat 10上运行Java Server Faces及配置报错解决
异常根因
java.lang.ClassNotFoundException: com.sun.faces.util.Util报错是JSF实现依赖配置错误导致,具体问题出在pom.xml的两处错误配置:
- 你引入的Mojarra(JSF官方参考实现,对应依赖
org.glassfish:jakarta.faces)加了<optional>true</optional>参数,项目打包时该依赖不会被打入war包,而Apache Tomcat本身没有内置JSF实现,运行时自然找不到对应的实现类。 - 依赖版本不兼容:你使用的父pom是Jakarta EE 9.1.0版本,但引入了
4.0.0-M1版本的Mojarra,该版本是适配Jakarta EE 10的测试版,和你当前的基础环境不匹配,同时冗余引入了jakarta.faces:jakarta.faces-api接口包,存在依赖冲突隐患。
修复步骤
- 移除冗余的
jakarta.faces:jakarta.faces-api依赖,你已经引入了全量的jakarta.jakartaee-api:9.1.0,其中已经包含了JSF接口定义,无需单独引入。 - 修改Mojarra依赖配置,去掉
optional参数,替换为适配Jakarta EE 9.1的稳定版本:
<dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.faces</artifactId> <version>3.0.2</version> <scope>runtime</scope> </dependency>
- 检查web.xml中Faces Servlet的配置,确保使用Jakarta EE 9+的正确全类名,不要使用旧的javax命名空间下的类:
<servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>jakarta.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>
- 清理本地Maven缓存,重新执行
mvn clean package打包后部署到Tomcat即可解决该异常。
内容的提问来源于stack exchange,提问作者Artso
相关产品推荐
相关产品推荐

