JBoss上安装JBPM出现NoClassDefFoundError: org/apache/log4j/Category求助
解决JBoss 5.1.0.GA + jBPM 4.4部署时的Log4j ClassNotFoundException问题
我之前在配置这套组合的时候也踩过一模一样的坑,折腾了好一阵才理清问题根源,给你几个亲测有效的排查和解决方向:
1. 排查JBoss自带Log4j的版本冲突
JBoss 5.1.0.GA本身默认自带了Log4j,但它的版本和jBPM 4.4依赖的Log4j版本可能不兼容(org.apache.log4j.Category是旧版Log4j的核心类,JBoss自带的版本可能做了精简或者版本差异导致无法识别)。
- 先去
${jboss.home}/server/default/lib目录下找到自带的log4j.jar,对比jBPM lib目录(${jbpm.home}/lib)里的log4j版本; - 如果版本不一致,直接把jBPM依赖的log4j.jar复制到
${jboss.home}/server/default/lib替换掉原文件,重启JBoss再试。
2. 确认部署后示例项目的lib目录是否包含log4j
虽然你在build.xml里确认了类路径,但Ant构建时的类路径和JBoss运行时的类路径是两回事:
- 检查部署后的示例项目包(比如
${jboss.home}/server/default/deploy/jbpm-examples.war)的WEB-INF/lib目录,看看有没有log4j.jar; - 如果没有,说明部署脚本没把依赖包复制进去,手动把
${jbpm.home}/lib下的log4j.jar拷贝到这个目录即可。
3. 调整JBoss的类加载优先级
JBoss 5的类加载隔离机制可能导致Web应用优先加载系统库而非自身依赖,这时候可以通过配置类加载规则解决:
- 在示例项目的
WEB-INF/jboss-web.xml(如果没有就新建一个)中添加以下配置:<jboss-web> <class-loading java2ClassLoadingCompliance="false"> <loader-repository> com.jbpm.examples:archive=jbpm-examples.war <loader-repository-config>java2ParentDelegation=false</loader-repository-config> </loader-repository> </class-loading> </jboss-web> - 这个配置会让Web应用优先加载自身
WEB-INF/lib下的依赖,避免和JBoss系统库的冲突。
4. 验证Ant构建时的类路径是否真的生效
有时候build.xml里的路径配置可能存在相对路径错误,导致Ant没正确引入log4j:
- 执行
ant -v demo.setup.jboss查看详细的构建日志,重点看类路径部分的输出,确认log4j.jar的路径是否正确被包含; - 如果路径有误,修正
${jbpm.home}/examples/build.xml中jbpm-deploy任务的类路径配置。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

