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

JBoss EAP 7.1部署失败:Integrator提供者未找到

解决JBoss EAP 7.1迁移中自定义Envers Integrator的类加载错误

从你提供的错误日志和部署结构来看,问题的核心是自定义CustomEnversIntegrator无法找到依赖的Hibernate Envers核心类,这是JBoss EAP 7.x和6.x在Hibernate版本、模块类加载机制上的差异导致的。下面是具体的分析和解决方案:

错误根源拆解

  1. 从server.log的NoClassDefFoundError: org/hibernate/envers/event/EnversIntegrator可以看出:你的自定义Integrator(位于EAR的lib目录)尝试引用的Envers类无法被加载。
  2. JBoss EAP 7.x使用Hibernate 5.1系列,而EAP 6.x用的是Hibernate 4.x,两者的Envers API路径、模块加载机制有明显变化:
    • EAP 6中可能直接将Envers打包在应用内,或者模块隔离性较弱;
    • EAP 7中Hibernate和Envers是作为独立系统模块存在的,应用默认无法直接访问这些模块的类。
  3. 另外,你的自定义Integrator通过ServiceLoader机制注册(META-INF/services/org.hibernate.integrator.spi.Integrator),这种方式下类加载器的可见性问题会被放大。

具体解决方案

方案1:适配Hibernate 5.x的API路径

首先检查你的CustomEnversIntegrator代码,Hibernate 5.x中EnversIntegrator的包路径已经变更:

  • EAP 6(Hibernate 4.x)的导入:import org.hibernate.envers.event.EnversIntegrator;
  • EAP 7(Hibernate 5.x)的导入:import org.hibernate.envers.boot.internal.EnversIntegrator;

修改代码中的导入语句,确保继承/引用的是Hibernate 5.x版本的EnversIntegrator类,这是最基础的适配步骤。

方案2:直接在persistence.xml中指定Integrator

放弃ServiceLoader注册方式,在pack-enterprise-domain-ejb.jar/META-INF/persistence.xml中显式指定自定义Integrator,同时声明Hibernate模块依赖:

<persistence-unit name="packEnterpise">
    <!-- 你的其他持久化配置 -->
    <properties>
        <!-- 指定Hibernate模块版本 -->
        <property name="jboss.as.jpa.providerModule" value="org.hibernate:5.1"/>
        <!-- 直接指定自定义Integrator -->
        <property name="hibernate.integrator_provider" value="com.comp.pack.enterprise.domain.util.CustomEnversIntegrator"/>
    </properties>
</persistence-unit>

这种方式绕过了ServiceLoader的类加载问题,让Hibernate直接加载你的自定义Integrator。

方案3:通过jboss-deployment-structure.xml声明模块依赖

如果坚持使用ServiceLoader注册方式,需要在EAR的META-INF/jboss-deployment-structure.xml中显式添加Envers模块依赖,确保EAR及其子模块能访问到Envers的类:

<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <!-- 引入Hibernate和Envers模块,并导出给子模块使用 -->
            <module name="org.hibernate" slot="main" export="true"/>
            <module name="org.hibernate.envers" slot="main" export="true"/>
        </dependencies>
    </deployment>
    <!-- 给EJB子模块单独声明依赖(可选,确保覆盖所有场景) -->
    <sub-deployment name="pack-enterprise-domain-ejb.jar">
        <dependencies>
            <module name="org.hibernate" slot="main"/>
            <module name="org.hibernate.envers" slot="main"/>
        </dependencies>
    </sub-deployment>
</jboss-deployment-structure>

验证步骤

  1. 先完成方案1的代码适配,确保API路径正确;
  2. 选择方案2或方案3调整配置;
  3. 重新打包EAR部署到EAP 7.1,查看server.log是否仍有类加载错误,若没有则部署成功。

内容的提问来源于stack exchange,提问作者Abhijeet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:17:25