部署CXF项目到JBoss EAP 6.4遇XML类型名重复问题求助
解决JBoss EAP 6.4部署CXF项目时JAXB重复XML类型错误
我遇到过类似的JBoss EAP与CXF整合的问题,那个你不认识的com.jason.app.control.jaxws_asm包其实是**JBossWS(JBoss自带的JAX-WS实现)**在运行时通过ASM字节码框架动态生成的辅助类。哪怕你已经排除了webservices子系统,JBoss可能仍有残留模块在后台生成这些类,和你自己的JAXB类发生了命名空间与类型名的冲突,最终引发了IllegalAnnotationsException。
下面是几个针对性的解决步骤:
1. 强化jboss-deployment-structure.xml的隔离配置
你的现有配置只排除了webservices子系统,但还需要彻底排除JBossWS相关模块以及自带的CXF/JAXB模块,避免它们干扰你的应用类加载。修改后的配置如下:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> <ear-subdeployments-isolated>false</ear-subdeployments-isolated> <deployment> <!-- 排除webservices子系统 --> <exclude-subsystems> <subsystem name="webservices" /> </exclude-subsystems> <!-- 排除所有JBossWS相关模块,阻止动态生成jaxws_asm类 --> <exclusions> <module name="org.jboss.ws.api" /> <module name="org.jboss.ws.spi" /> <module name="org.jboss.ws.common" /> <module name="org.jboss.ws.core" /> <module name="org.jboss.ws.jaxws" /> <!-- 排除JBoss自带的CXF模块,避免版本冲突 --> <module name="org.apache.cxf" /> <module name="org.apache.cxf.impl" /> <!-- 排除JBoss自带的JAXB模块,强制使用应用自带的版本 --> <module name="com.sun.xml.bind" /> <module name="javax.xml.bind.api" /> </exclusions> <!-- 确保应用自身的类优先于JBoss模块加载 --> <local-last value="false" /> </deployment> </jboss-deployment-structure>
2. 确认JAXB类的命名空间配置
虽然冲突的类是动态生成的,但仍需确保你自己的JAXB类(比如com.jason.app.adminservices.UpdateQuantityAllocationResponse)正确设置了@XmlType注解,明确指定唯一的名称和命名空间:
@XmlType(name = "UpdateQuantityAllocationResponse", namespace = "http://app.application.com/adminServices") public class UpdateQuantityAllocationResponse { // 类实现代码 }
同时检查你的ObjectFactory类,确保生成JAXBElement时使用的命名空间和类的命名空间完全一致。
3. 验证EAR包内容与类加载
- 确认你的EAR包中包含了所有必需的CXF依赖(比如
cxf-rt-frontend-jaxws-3.1.13.jar、cxf-rt-databinding-jaxb-3.1.13.jar等),且这些包位于EAR的lib目录或WAR模块的WEB-INF/lib目录下。 - 确保EAR包中没有混入JBoss自带的JAX-WS/JAXB相关jar包,避免类加载混乱。
4. 清理JBoss临时文件
JBoss的临时目录可能残留了之前部署生成的动态类,导致冲突无法消除。清理以下目录后重新部署:
JBOSS_HOME/standalone/tmpJBOSS_HOME/standalone/data
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

