You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JBoss EAP 6.4启动Mojarra时崩溃问题求助

解决JBoss EAP 6.4热部署Mojarra 2.1.28崩溃问题

嘿,我之前在维护基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:58:43