MyFaces从2.0.18升级至3.0.2后JBOSS EAP 7.1部署报错求助
MyFaces 3.0.2部署JBOSS EAP 7.1失败问题排查
问题背景
将MyFaces从2.0.18升级至3.0.2后,部署到JBOSS EAP 7.1服务器时出现部署失败,无法完成应用启动。
报错信息
[2023-10-11 03:03:25,907] Artifact TestNumberEAR-2.0.7-SNAPSHOT.ear: Error during artifact deployment. See server log for details. [2023-10-11 03:03:25,907] Artifact TestNumberEAR-2.0.7-SNAPSHOT.ear: java.lang.Exception: {"WFLYCTL0080: Failed services" => {"jboss.deployment.subunit."TestNumberEAR-2.0.7-SNAPSHOT.ear"."TestNumberGenerator.war".INSTALL" => "WFLYSRV0153: Failed to process phase INSTALL of subdeployment "TestNumberGenerator.war" of deployment "TestNumberEAR-2.0.7-SNAPSHOT.ear" Caused by: java.lang.NoClassDefFoundError: Failed to link org/apache/myfaces/taglib/core/VerbatimTag (Module "deployment.TestNumberEAR-2.0.7-SNAPSHOT.ear.TestNumberGenerator.war" from Service Module Loader): Failed to link org/apache/myfaces/shared/taglib/UIComponentELTagBase (Module "deployment.TestNumberEAR-2.0.7-SNAPSHOT.ear.TestNumberGenerator.war" from Service Module Loader): Failed to link jakarta/faces/webapp/UIComponentELTag (Module "deployment.TestNumberEAR-2.0.7-SNAPSHOT.ear.TestNumberGenerator.war" from Service Module Loader): jakarta/servlet/jsp/tagext/Tag"},"WFLYCTL0412: Required services that are not installed:" => ["jboss.deployment.subunit."TestNumberEAR-2.0.7-SNAPSHOT.ear"."TestNumberGenerator.war".deploymentCompleteService"],"WFLYCTL0180: Services with missing/unavailable dependencies" => ["jboss.deployment.unit."TestNumberEAR-2.0.7-SNAPSHOT.ear".deploymentCompleteService is missing [jboss.deployment.subunit."TestNumberEAR-2.0.7-SNAPSHOT.ear"."TestNumberGenerator.war".deploymentCompleteService"]}
当前依赖配置(pom.xml)
<dependency> <groupId>org.apache.myfaces.core</groupId> <artifactId>myfaces-impl</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>org.apache.myfaces.core</groupId> <artifactId>myfaces-api</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>org.apache.myfaces.core.internal</groupId> <artifactId>myfaces-impl-shared</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> </dependency> <dependency> <groupId>jakarta.faces</groupId> <artifactId>jakarta.faces-api</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>jakarta.el</groupId> <artifactId>jakarta.el-api</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>8.0.0</version> <scope>provided</scope> </dependency>
当前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_5_0.xsd" metadata-complete="false" version="5.0"> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> </web-app>
问题根源
- 容器与框架版本不兼容:JBOSS EAP 7.1基于Java EE 8规范,提供的是
javax.*命名空间的API;而MyFaces 3.0.2是Jakarta EE 9规范实现,依赖的是jakarta.*命名空间的API。EAP 7.1容器中不存在jakarta.servlet.jsp.tagext.Tag这类类,导致NoClassDefFoundError。 - 依赖版本冲突:pom.xml中同时引入了Jakarta EE 9的API(如
jakarta.servlet-api:5.0.0、jakarta.faces-api:3.0.0)和Java EE 8的API包(jakarta.jakartaee-api:8.0.0),两类规范的API命名空间不同,引发依赖混乱。 - web.xml版本不匹配:web.xml使用了Jakarta EE 9对应的
web-app_5_0.xsd和版本5.0,但EAP 7.1仅支持最高Java EE 8的web.xml版本4.0,容器无法正确解析该配置。
解决方案
方案一:降级MyFaces到兼容版本
将MyFaces版本降级至2.3.x系列(支持Java EE 8,与EAP 7.1兼容),调整pom.xml依赖如下:
<!-- 替换MyFaces 3.x为2.3.x --> <dependency> <groupId>org.apache.myfaces.core</groupId> <artifactId>myfaces-impl</artifactId> <version>2.3.10</version> </dependency> <dependency> <groupId>org.apache.myfaces.core</groupId> <artifactId>myfaces-api</artifactId> <version>2.3.10</version> </dependency> <!-- 移除Jakarta EE 9的API依赖,改用Java EE 8的javax包 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.faces</groupId> <artifactId>javax.faces-api</artifactId> <version>2.3</version> <scope>provided</scope> </dependency> <!-- 保留Java EE 8的API包,scope为provided由容器提供 --> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>8.0.0</version> <scope>provided</scope> </dependency>
同时调整web.xml为Java EE 8版本:
<?xml version="1.0" encoding="UTF-8"?> <web-app 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-app_4_0.xsd" metadata-complete="false" version="4.0"> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> </web-app>
方案二:升级JBOSS服务器
将JBOSS EAP升级至8.x版本,该版本支持Jakarta EE 9规范,可直接兼容MyFaces 3.0.2及相关Jakarta API依赖,无需大幅调整应用配置。
内容的提问来源于stack exchange,提问作者vnjapa
相关产品推荐
相关产品推荐

