【问题标题】:Use packaged hibernate version in EAR在 EAR 中使用打包的休眠版本
【发布时间】:2017-08-30 08:14:35
【问题描述】:

我正在JBoss EAP 7.0.0 上部署我的 EAR,它具有以下结构:

app.ear
|-- ejb.jar
|-- app.war
|-- lib
     |-- hibernate-core-5.2.10.Final.jar
     |-- hibernate-hibernate-spatial-5.2.10.Final.jar
     |-- hibernate-commons-annotations-5.0.1.Final.jar
|-- META-INF
     |-- application.xml
     |-- jboss-app.xml 

我在我的一个 EJB bean 中添加了一小段代码,它打印 org.hibernate.Version.getVersionString() 以了解我的应用程序正在使用哪个版本的 Hibernate,它给了我 5.0.9.Final-readhat-1 而不是 5.2.10.Final 之类的东西。

我读过很多关于类加载问题的文章(尤其是herehere),但经过多次不同的试验,我找不到让JBoss 在我的EAR 中使用打包版本的Hibernate 的方法。

看起来标签在 EAP 7 中被忽略了?似乎 JBoss AS 7 中的类加载 has changed

这是我的 jboss-app.xml 的内容:

<?xml version="1.0" encoding="UTF-8"?>  
<jboss-app>   
  <loader-repository>  
    my.package:archive=app.ear  
    <loader-repository-config>   
    java2ParentDelegation=false  
    </loader-repository-config>  
  </loader-repository>   
</jboss-app> 

有没有办法强制 JBoss EAP 7 在引导类加载器之前从我的 EAR 加载类?

注意:我也发布了这个问题here

================================================ ======== 编辑

我试过这个jboss-deployment-structure.xml

<jboss-deployment-structure>
    <deployment>
        <exclude-subsystems>
            <subsystem name="org.hibernate" />
        </exclude-subsystems>
        <exclusions>
            <module name="org.hibernate" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

在部署过程中,我收到以下错误:

{"WFLYCTL0062: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"WFLYCTL0080: Failed services" => {"jboss.persistenceunit.\"app.ear/ejb.jar#app-ejbPU\"" => "org.jboss.msc.service.StartException in service jboss.persistenceunit.\"app.ear/ejb.jar#app-ejbPU\": java.util.ServiceConfigurationError: org.hibernate.integrator.spi.Integrator: Provider org.hibernate.envers.boot.internal.EnversIntegrator not a subtype
Caused by: java.util.ServiceConfigurationError: org.hibernate.integrator.spi.Integrator: Provider org.hibernate.envers.boot.internal.EnversIntegrator not a subtype"}}}}

【问题讨论】:

    标签: java hibernate classloader jboss-eap-7


    【解决方案1】:

    JBoss 7(和 WildFly)使用模块系统而不是类加载器来分隔不同的应用程序和库。

    尝试在您的应用中禁用休眠:在您的 EAR 的 META-INF 文件夹中放置一个 jboss-deployment-stucture.xml 文件:

    <jboss-deployment-structure>
      <deployment>
        <exclusions>
          <module name="org.hibernate" />
        </exclusions>
      </deployment>
    </jboss-deployment-structure>
    

    见:https://docs.jboss.org/author/display/WFLY10/Class+Loading+in+WildFly

    【讨论】:

    • 感谢您的回复。不幸的是,根据您的建议,EAR 的部署失败,因为缺少服务:WFLYCTL0180: Services with missing/unavailable d ependencies" =&gt; ["jboss.persistenceunit.\"app.ear/ejb.jar#app-ejbPU\".__FIRST_PHASE__ is missing [jboss.naming.context.java.jdbc.app] 我尝试使用jboss-deployment-structure.xml 中的嵌入式类重新声明模块,但由于 ClassLoaderIssues,我仍然遇到配置错误:org.hibernate.integrator.spi.Integrator: Provider org.hibernate.envers.boot.internal.EnversIntegrator not a subtype
    • 您可能在项目的 WEB-INF/lib 目录中拥有所有与休眠相关的库。但是 JBoss 提供的库导致了冲突,因此您删除了 JBOSS_HOME\modules\system\ 中 module.xml 文件中标签 中的内容层\base\org\hibernate\主目录。此外,您还删除了 jboss-deployment-structure.xml 中 hibernate 库的依赖项,~~~ ~~~ 在这些之后可以克服休眠冲突问题的更改
    • JBoss EAP 7 服务器有一个 Hibernate 5.0.x 版本。要使用 Hibernate 5.2.x,您必须排除默认的 Hibernate 并打包正确的 Hibernate。见docs.jboss.org/author/display/WFLY8/Class+Loading+in+WildFly
    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2015-02-10
    • 2010-10-10
    相关资源
    最近更新 更多