WildFly部署JSF项目遭遇NoClassDefFoundError问题求助
JSF项目部署WildFly报错及配置修复
项目配置(pom.xml)
<?xml version="1.0" encoding="UTF-8"?> <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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>lab3</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>javax.faces</groupId> <artifactId>jsf-api</artifactId> <version>2.1</version> </dependency> <dependency> <groupId>javax.faces</groupId> <artifactId>jsf-impl</artifactId> <version>1.2-20</version> </dependency> <dependency> <groupId>javax.faces</groupId> <artifactId>javax.faces-war-archetype</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>9.1.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>lab3</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.1</version> <configuration> <webXml>src\main\webapp\WEB-INF\web.xml</webXml> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> </plugins> </build> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties>
启动报错信息
13:16:20,965 INFO [org.jboss.as.server.deployment] (MSC service thread 1-6) WFLYSRV0028: Stopped deployment lab3.war (runtime-name: lab3.war) in 14ms [2022-10-12 01:16:20,998] Artifact lab3.war: Error during artifact deployment. See server log for details. [2022-10-12 01:16:20,998] Artifact lab3.war: java.lang.Exception: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"lab3.war\".undertow-deployment.UndertowDeploymentInfoService" => "Failed to start service Caused by: java.lang.NoClassDefFoundError: Failed to link javax/faces/webapp/FacesServlet (Module \"deployment.lab3.war\" from Service Module Loader): javax/servlet/Servlet"}}
额外问题
无论是自行搭建的项目,还是他人的现成项目,均无法正常运行;同时target目录中生成的web.xml存在异常情况。
问题根源及修复方案
问题分析
报错核心原因是依赖版本混乱+命名空间不兼容:
- 混用旧的
javax.faces依赖(JSF 1.2/2.1)与Jakarta EE 9.1的jakarta.jakartaee-api,两者命名空间从javax改为jakarta,完全不兼容; - JSF依赖版本不统一(api是2.1,impl是1.2),引发类加载冲突;
- 错误引入
javax.faces-war-archetype,这是Maven原型模板,并非运行依赖,完全无需加入pom。
修复步骤
- 清理并统一依赖
删除旧的javax.faces相关依赖,替换为与Jakarta EE9匹配的Jakarta Faces依赖;移除无用的原型依赖。修正后的dependencies块如下:
<dependencies> <!-- Jakarta Faces 3.0,对应Jakarta EE9 --> <dependency> <groupId>jakarta.faces</groupId> <artifactId>jakarta.faces-api</artifactId> <version>3.0.0</version> <scope>provided</scope> <!-- WildFly 26+自带JSF3,设为provided即可 --> </dependency> <!-- 若WildFly未自带JSF,可添加实现包,否则无需 --> <!-- <dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.faces</artifactId> <version>3.0.0</version> </dependency> --> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>9.1.0</version> <scope>provided</scope> </dependency> </dependencies>
- 检查并修正web.xml
确保web.xml版本与Jakarta EE9匹配(使用web-app_4_0.xsd或更高,命名空间改为jakarta.servlet相关)。示例web.xml头部:
<?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_4_0.xsd" version="4.0">
同时将FacesServlet的类路径改为jakarta.faces.webapp.FacesServlet(替换旧的javax.faces.webapp.FacesServlet)。
验证WildFly版本
确认使用的WildFly版本支持Jakarta EE9(如WildFly 26及以上),旧版本仅支持javax命名空间的JEE规范,无法兼容Jakarta EE9依赖。重新构建部署
执行mvn clean install清理旧构建文件,重新打包后部署到WildFly。
内容的提问来源于stack exchange,提问作者skver
相关产品推荐
相关产品推荐

