PrimeFaces11+JDK17+Tomcat10.1.7部署后访问404且无日志报错
PrimeFaces 11 + Tomcat 10.1.7 404错误排查修复
问题背景
使用PrimeFaces 11、JDK 17、Tomcat 10.1.7、Maven 3.8.8创建名为pf2的PrimeFaces应用,WAR包已成功部署到Tomcat,但访问http://localhost:8080/pf2/时出现HTTP 404错误,且控制台/日志无报错信息。
核心问题分析
Tomcat属于Servlet容器,本身不包含Jakarta Faces(JSF)的实现类,你的pom.xml仅引入了Jakarta EE API(jakarta.jakartaee-api),但该依赖是provided范围,意味着运行时需要容器提供实现,而Tomcat并没有提供JSF实现,导致FacesServlet无法初始化,最终引发404。此外还有几处配置不匹配当前技术栈的问题,一并修复:
具体修复步骤
1. 添加Jakarta Faces(Mojarra)实现依赖
在pom.xml的<dependencies>中添加适配Jakarta EE 10的Mojarra依赖:
<dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.faces</artifactId> <version>4.0.1</version> </dependency>
2. 修正Maven编译版本
JDK用的是17,但maven-compiler-plugin指定的release是11,需同步改为17,并升级插件版本以支持JDK17:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <release>17</release> </configuration> </plugin>
3. 更新web.xml到Servlet 5.0版本
Tomcat 10.1对应Servlet 5.0,原web.xml的4.0版本不匹配,更新schema和版本:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <display-name>My PrimeFaces Application</display-name> <context-param> <param-name>primefaces.THEME</param-name> <param-value>ui-lightness</param-value> </context-param> <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> <session-config> <session-timeout>30</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.xhtml</welcome-file> </welcome-file-list> </web-app>
4. 验证页面路径
确保index.xhtml放在项目src/main/webapp根目录下,而非子文件夹中。
5. 完整修正后的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.test</groupId> <artifactId>pf2</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>pf2</name> <description>test for primefaces</description> <dependencies> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>10.0.0</version> <scope>provided</scope> </dependency> <!-- PrimeFaces Jakarta版本 --> <dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <version>11.0.0</version> <classifier>jakarta</classifier> </dependency> <!-- 添加JSF实现Mojarra --> <dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.faces</artifactId> <version>4.0.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <release>17</release> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> </project>
验证修复
- 执行
mvn clean package重新生成WAR包 - 重新部署到Tomcat
- 访问
http://localhost:8080/pf2/或直接访问http://localhost:8080/pf2/index.xhtml确认页面正常显示
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

