使用打包休眠版本EAR
问题描述:
我部署我的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
。我已经读了很多关于类加载问题(特别是here和here),但经过很多不同的试验后,我找不到让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"}}}}
答
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
感谢您的答复。不幸的是,由于您的建议,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
您可能在项目的WEB-INF/lib目录中包含所有与hibernate相关的库。但JBoss提供的库引发了冲突,因此您已经删除了JBOSS_HOME \ modules \ system \中可用的module.xml文件中的 ~~~ 经过这些更改,您可以解决冲突问题hibernate –
JBoss EAP 7服务器具有Hibernate 5.0.x版本要使用Hibernate 5.2.x,您必须排除默认的Hibernate并打包正确的。请参阅https://docs.jboss.org/author/display/WFLY8/Class+Loading+in+WildFly –