You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

问题根源

  1. 容器与框架版本不兼容: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。
  2. 依赖版本冲突: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命名空间不同,引发依赖混乱。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:29:53