2017-08-30 41 views
0

我部署我的JBoss EAP 7.0.0 EAR,它具有以下结构:使用打包休眠版本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的类加载has changed AS 7

这里是我的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,从我的耳边加载类在引导类加载器之前?

注意:我也发布了这个问题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"}}}} 

回答

0

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

尝试在你的应用程序禁用休眠:放置jboss-deployment-stucture.xml文件在你的EAR的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

+0

感谢您的答复。不幸的是,由于您的建议,EAR的部署失败,因为缺少该服务:“WFLYCTL0180:缺少/不可用的服务d 附件”=> [“jboss.persistenceunit。”app.ear/ejb.jar#app-ejbPU \“.__ FIRST_PHASE__缺失[jboss.naming.context.java.jdbc.app]' 我试图用'jboss-deployment-structure.xml'中的嵌入类重新声明该模块,但之后出现配置错误仍然归因于ClassLoaderIssues:'org.hibernate.integrator.spi.Integrator:Provider org.hibernate.envers.boot.internal.EnversIntegrator不是子类型' – ctabin

+0

您可能在项目的WEB-INF/lib目录中包含所有与hibernate相关的库。但JBoss提供的库引发了冲突,因此您已经删除了JBOSS_HOME \ modules \ system \中可用的module.xml文件中的 ~~~ 经过这些更改,您可以解决冲突问题hibernate –

+0

JBoss EAP 7服务器具有Hibernate 5.0.x版本要使用Hibernate 5.2.x,您必须排除默认的Hibernate并打包正确的。请参阅https://docs.jboss.org/author/display/WFLY8/Class+Loading+in+WildFly –