Jakarta Faces 3:JSF标签未转HTML且FacesServlet类找不到
问题分析与解决建议
核心版本兼容性问题
Tomcat 8.5.x 仅支持 Java EE 8(javax. 命名空间),而你使用的 Jakarta EE 9.1 + JSF 3.0 属于 Jakarta EE 9(jakarta. 命名空间),两者命名空间完全不兼容,这是导致jakarta.faces.webapp.FacesServlet无法加载、JSF标签无法解析的根本原因。
具体解决方案
方案1:降级依赖适配Tomcat 8.5
将Maven依赖替换为Java EE 8规范下的JSF 2.3版本(对应javax命名空间):
<!-- Java EE 8 API --> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>8.0</version> <scope>provided</scope> </dependency> <!-- JSF 2.3 实现(Mojarra) --> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.faces</artifactId> <version>2.3.17</version> <scope>compile</scope> </dependency>
同步修改web.xml中的Servlet配置为javax命名空间:
<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>
方案2:升级Tomcat支持Jakarta EE 9
若坚持使用Jakarta EE 9.1 + JSF 3.0,需将Tomcat升级到 Tomcat 10.x:
- Tomcat 10.0.x 适配Jakarta EE 9
- Tomcat 10.1.x 适配Jakarta EE 9.1
额外检查项
- 确认Maven依赖scope:JSF实现(如Mojarra)设为
compile,确保打包后能被Tomcat加载;Java EE/Jakarta EE API设为provided,避免与Tomcat自带API冲突。 - 清理缓存:在IntelliJ中执行
File → Invalidate Caches...,同时删除Tomcat的work目录,清除旧缓存干扰。 - 检查
faces-config.xml命名空间:方案1对应http://xmlns.jcp.org/xml/ns/javaee,方案2对应http://xmlns.jcp.org/xml/ns/jakartaee。
内容的提问来源于stack exchange,提问作者myyvee
相关产品推荐
相关产品推荐

