JBoss EAP 6.4启动Mojarra时崩溃问题求助
嘿,我之前在维护基于JBoss EAP 6.4的JSF应用时,也碰到过几乎一模一样的问题——首次部署一切正常,改点代码热部署就炸在Mojarra启动这一步。结合你日志里的超时提示和上下文工厂找不到备份的错误,大概率是热部署时JSF类加载冲突、资源未释放或者初始化超时导致的,给你几个亲测有效的解决方案:
1. 排除JBoss自带JSF模块,避免类加载冲突
JBoss EAP 6.4默认自带了JSF模块,但如果你的应用自己打包了Mojarra 2.1.28的jar包,很容易出现类加载冲突,热部署时这个问题会被放大。
你可以在应用的WEB-INF目录下创建(或修改)jboss-deployment-structure.xml,添加以下内容来排除服务器自带的JSF模块:
<jboss-deployment-structure> <deployment> <exclusions> <module name="javax.faces.api" /> <module name="com.sun.jsf-impl" /> </exclusions> </deployment> </jboss-deployment-structure>
这样应用就会完全使用自己打包的Mojarra版本,避免和服务器自带版本的类加载冲突。
2. 调整热部署超时时间
从日志里的超时提示来看,Mojarra在热部署时的初始化时间超过了JBoss默认的部署超时阈值。你可以修改JBoss的配置文件来延长这个时间:
- 如果是单机模式,打开
JBOSS_HOME/standalone/configuration/standalone.xml - 如果是域模式,打开
JBOSS_HOME/domain/configuration/domain.xml
找到deployment-scanner子系统,修改deployment-timeout的值(默认是60秒,改成120秒试试):
<subsystem xmlns="urn:jboss:domain:deployment-scanner:1.2"> <deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000" deployment-timeout="120" /> </subsystem>
给Mojarra足够的时间完成热部署后的初始化。
3. 清理JBoss临时缓存文件
热部署次数多了,JBoss的临时目录里会残留旧的类文件、缓存数据,这些脏数据很容易导致类加载异常。你可以按以下步骤清理:
- 先完全停止JBoss服务器
- 删除
JBOSS_HOME/standalone/tmp和JBOSS_HOME/standalone/data目录下的所有内容 - 重新启动服务器,再部署应用测试热部署是否正常
4. 检查代码修改是否引入了JSF上下文问题
如果你修改的代码涉及JSF核心逻辑,比如FacesContext操作、自定义组件或生命周期扩展,要注意:
- 绝对不要在静态变量中持有
FacesContext的引用,热部署时类重新加载会导致旧引用失效,引发上下文工厂错误 - 自定义的JSF扩展(比如
FacesContextFactory实现)要确保在热部署时能正确注册和销毁,避免残留实例干扰新部署的应用
如果以上方法都没解决问题,你可以暂时关闭JBoss的热部署功能,改用手动重新打包部署的方式——虽然麻烦,但能彻底规避热部署带来的类加载问题。另外,Mojarra 2.1.28确实比较老了,JBoss EAP 6.4官方推荐的Mojarra版本是2.1.34,升级到这个版本也能解决不少已知的热部署bug。
内容的提问来源于stack exchange,提问作者alissonssz

