部署含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模块:
- 在
JBOSS_HOME/modules/system/layers/base/com/sun/jsf-impl/main目录下,替换现有的JAR为javax.faces-2.2.11.jar,同时修改module.xml,将资源路径和版本更新为2.2.11。 - 同样,在
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
相关产品推荐
相关产品推荐

