JDK11下Spring+GWT项目部署JBoss7.2报LinkageError如何解决
问题根因
报错属于JBoss/WildFly典型的类加载约束冲突,核心触发逻辑:org.springframework.beans.factory.BeanFactory接口被两个独立的类加载器分别加载了两份不同的字节码:
- EAR包根类加载器(
deployment.xxx-ear-2.0.12.ear)首先加载了一份Spring类 - 嵌套的
xxx-gwt.war包自带独立类加载器,内部也包含Spring相关jar,尝试加载同名接口时触发类一致性校验失败
该问题和Maven、Spring、Guava、GWT版本无直接关联,本质是打包结构与JBoss类加载隔离规则不匹配导致的重复类问题。
解决方案
按优先级顺序尝试:
- 统一Spring依赖加载层级
将所有Spring相关jar包统一放置在EAR包的公共lib目录下,彻底删除xxx-gwt.war包内WEB-INF/lib路径下所有spring-*开头的jar包,保证整个EAR范围内Spring类仅由EAR根类加载器加载一次,不存在多份重复类。
如果使用Maven构建EAR项目,在ear模块的pom.xml中将Spring依赖配置为EAR公共lib依赖,同时在gwt-war模块中将所有Spring依赖的scope设置为provided,避免war构建时重复打入Spring jar。 - 配置WAR包独立类加载规则
若架构限制无法将Spring统一放到EAR公共目录,在xxx-gwt.war的WEB-INF路径下新增jboss-deployment-structure.xml配置文件,阻断EAR层Spring类的隐式传递,让WAR包使用自身携带的类加载,配置内容如下:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <exclusions> <!-- 排除EAR层传递的依赖,避免类版本冲突 --> <module name="deployment.xxx-ear-2.0.12.ear"/> </exclusions> </deployment> </jboss-deployment-structure>
如果EAR内其他模块(如EJB模块)需要和WAR包互通,不要全局排除整个EAR模块,仅单独排除Spring相关的类路径即可。
- 排查重复传递依赖
执行mvn dependency:tree命令检查gwt-war模块的完整依赖树,排查是否存在通过第三方组件(GWT扩展包、工具包等)隐式引入的不同版本Spring依赖,将所有和EAR层Spring版本不一致的传递依赖全部排除,保证EAR全范围内Spring版本完全统一。 - 临时绕过方案(不推荐生产使用)
在JBoss启动脚本中添加JVM参数-Dorg.jboss.modules.disableConstraints=true关闭类加载约束校验,该方案仅可用于临时验证问题,长期使用会掩盖类冲突问题,引发更隐蔽的运行时异常。
部署前校验
调整配置后重新构建,先解压构建产物检查:
- EAR包lib目录下所有Spring jar版本完全一致
- WAR包WEB-INF/lib目录下无重复的Spring jar
- 整个EAR包内搜索
spring-beans相关jar,确认仅存在一份
确认后再部署即可解决该报错。
内容的提问来源于stack exchange,提问作者UmaShankar Adha
相关产品推荐
相关产品推荐

