在EAR中使用打包的hibernate版本

时间:2017-08-30 08:14:36

标签: java hibernate classloader jboss-eap-7

我在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"}}}}

1 个答案:

答案 0 :(得分:0)

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

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

<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