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

部署含PrimeFaces的JSF应用至JBOSS-EAP-6.4时遇ClassFormatError

解决JBoss EAP 6.4部署JSF+PrimeFaces时的DataModel ClassFormatError

这个java.lang.ClassFormatError: Absent Code attribute问题本质是类加载冲突:你项目里打包的JSF API/JAR和JBoss EAP自带的JSF实现模块出现了版本或类型不匹配,导致加载到的javax.faces.model.DataModel是只有API定义、没有实际代码的类(通常来自仅含API的JAR包)。结合你的pom配置和环境,我给你一步步的解决方案:

1. 清理POM里的重复/冲突依赖

你的pom里有多个重复的JSF、EL相关依赖,这是核心问题之一:

  • 同时引入了org.glassfish:javax.faces(包含JSF API+实现)和com.sun.faces:jsf-api(仅API),会导致打包时出现重复类,JBoss加载时混乱。
  • javax.el:el-api和org.glassfish.web:el-impl与JBoss自带的EL实现冲突,JBoss EAP 6.4已经内置了符合Java EE 6规范的EL容器。
  • jboss-javaee-6.0作为provided依赖已经包含了JSF、EL、Servlet等API,无需重复引入。

修改后的pom依赖应该精简成这样:

<!-- JSF:因为JBoss EAP 6.4默认是JSF 2.1,你要用2.2的话,后续要配置JBoss模块,这里先设为provided避免打包冲突 -->
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.faces</artifactId>
    <version>2.2.11</version>
    <scope>provided</scope>
</dependency>

<!-- Servlet/JSP/JSTL:JBoss自带,设为provided -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
    <scope>provided</scope>
</dependency>

<!-- Java EE 6规范:provided即可,无需重复引入子依赖 -->
<dependency>
    <groupId>org.jboss.spec</groupId>
    <artifactId>jboss-javaee-6.0</artifactId>
    <version>1.0.0.Final</version>
    <type>pom</type>
    <scope>provided</scope>
</dependency>

<!-- Omnifaces、PrimeFaces及其扩展:这些需要打包进WAR -->
<dependency>
    <groupId>org.omnifaces</groupId>
    <artifactId>omnifaces</artifactId>
    <version>1.14</version>
</dependency>
<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>6.2</version>
</dependency>
<dependency>
    <groupId>org.primefaces.themes</groupId>
    <artifactId>afterwork</artifactId>
    <version>1.0.10</version>
</dependency>
<dependency>
    <groupId>org.primefaces.extensions</groupId>
    <artifactId>primefaces-extensions</artifactId>
    <version>6.2</version>
</dependency>
<dependency>
    <groupId>org.primefaces.extensions</groupId>
    <artifactId>resources-ckeditor</artifactId>
    <version>6.2</version>
</dependency>

2. 配置JBoss EAP 6.4使用JSF 2.2

因为JBoss EAP 6.4默认搭载的是JSF 2.1,而你用的是JSF 2.2,必须替换JBoss的JSF模块才能避免版本冲突:

  • 替换JBoss的JSF模块:
    1. 在JBOSS_HOME/modules/system/layers/base/com/sun/jsf-impl/main目录下,替换现有的JAR为javax.faces-2.2.11.jar,同时修改module.xml,将资源路径和版本更新为2.2.11。
    2. 同样,在com/sun/jsf-api/main目录下,替换JAR并更新module.xml。
  • 在项目的WEB-INF目录下创建jboss-deployment-structure.xml,强制JBoss使用你配置的JSF 2.2模块:
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="com.sun.jsf-impl" slot="main"/>
            <module name="com.sun.jsf-api" slot="main"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

3. 验证打包后的WAR

清理并重新打包你的项目,确保WAR的WEB-INF/lib目录下没有javax.faces.jar、jsf-api.jar、el-api.jar、el-impl.jar这些JBoss自带的JAR,避免类加载优先级问题。

为什么之前的解决方案没用?

你提到的官方wiki方案是针对一般的Absent Code问题,但你的情况是JSF版本不兼容+依赖重复打包双重问题,只调整单个类加载设置无法解决,必须同时清理依赖和配置JBoss的JSF模块。

内容的提问来源于stack exchange,提问作者user1734698

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:46:00