Servlet过滤器集成至现有项目遇NoClassDefFoundError求助
解决Servlet Filter集成后JBoss部署出现的NoClassDefFoundError问题
看起来你遇到的是典型的类加载冲突+依赖不匹配问题,本地编译没问题但部署到JBoss就出问题,还交替报错,大概率是JBoss自带的库和你项目里的依赖打架了,或者依赖本身没配对。我之前处理过类似的情况,给你几个具体的解决步骤:
1. 先把依赖版本搞对,别混用JDOM1和JDOM2
你提到加了JDOM的jar但没解决,首先要确认:
- 如果你的代码里用的是
org.jdom2.*包下的类(比如org.jdom2.JDOMException),那必须引入JDOM2的jar(比如jdom2-2.0.6这种稳定版),绝对不能用JDOM1.x的(JDOM1是org.jdom.*包,和JDOM2完全是两套包结构)。 - xmldsig相关的异常,一般是Apache Santuario的
xmlsec包没配上,而且要和JDOM2版本兼容。如果用Maven的话,直接在pom.xml里加这两个依赖:
<dependency> <groupId>org.jdom</groupId> <artifactId>jdom2</artifactId> <version>2.0.6</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.santuario</groupId> <artifactId>xmlsec</artifactId> <version>2.2.3</version> <scope>compile</scope> </dependency>
注意scope设为compile,确保这两个jar会被打包到war的WEB-INF/lib目录里。
2. 解决JBoss的类加载冲突
JBoss(尤其是EAP系列)本身会自带一些开源库的旧版本,比如xmlsec或者JDOM,这会导致类加载优先级混乱——有时候加载JBoss自带的旧类,有时候加载你项目里的新类,就会交替出现找不到类的错误。
解决办法是在项目的WEB-INF目录下新建一个jboss-deployment-structure.xml文件,配置排除JBoss自带的冲突模块,让项目优先用自己的依赖:
<jboss-deployment-structure> <deployment> <exclusions> <!-- 排除JBoss自带的xmlsec模块 --> <module name="org.apache.santuario.xmlsec" /> <!-- 排除JBoss自带的JDOM相关模块(如果有的话) --> <module name="org.jdom" /> <module name="org.jdom2" /> </exclusions> </deployment> </jboss-deployment-structure>
这个配置会告诉JBoss:“别用你自带的这些库,用我项目里的就行”。
3. 检查部署包的内容
打包war之后,一定要解压看看WEB-INF/lib目录里有没有jdom2-xxx.jar和xmlsec-xxx.jar——如果这两个jar没在里面,那肯定会报找不到类的错误。
- 如果用Maven,执行
mvn clean package之后,去target目录下找war包解压检查; - 如果是IDE直接部署,要确认部署配置里没有把这两个依赖排除掉。
4. 最后检查代码里的import语句
别犯低级错误:如果之前用过JDOM1,现在改成JDOM2,要把所有的import org.jdom.*都改成import org.jdom2.*,混着用肯定会出问题。
按这几步走,应该能解决你交替报错的问题,我之前就是这么搞定JBoss里的类加载冲突的。
内容的提问来源于stack exchange,提问作者Nikhil Kumar
相关产品推荐
相关产品推荐

