当前位置: 首页 > 知识库问答 >
问题:

不包括在JBoss EAP 7.2.1.GA中加载hibernate-core-5.3.9.Final-redhat-00002.jar

李和昶
2023-03-14

我们在JBoss EAP中部署了一个webapp7.2.1.GA包括hibernate JPA。

我们得到了一个例外:

Caused by: java.lang.ClassCastException: org.hibernate.jpa.HibernatePersistenceProvider cannot be cast to javax.persistence.spi.PersistenceProvider

由于JBosshibernate-core-5.3.9.Final-redhat-00002.jar中包含的jar与webapp中包含的jarorg.hibernate.jpa.HibernatePersistenceProvider冲突org.hibernate.hibernate-entityManager: 5.1.10。

由于 JBoss 类加载策略,在 JBoss 类路径中定义的 jar 优先于在我们的 Web 应用程序中打包的 jar,因此这是 JBoss 的预期行为。

但是,我们需要配置类加载策略,以便在我们的应用程序中配置的 jar 优先于应用程序服务器中的 jar,或者,也许,在应用程序服务器中排除该应用程序。

我们试图在部署和子部署战争级别配置jboss-部署-结构.xml,以便排除这种依赖性,运气不好。我们尝试了不同的排除项组合,包括排除每个模块和子系统,但Hibernate核心-5.3.9.final-redhat-00002.jar总是被加载,我们总是得到 ClassCastException。

在文档中,我们发现:

本机Hibernate使用。直接使用Hibernate API的应用程序在这里被称为本地Hibernate应用程序。本地Hibernate应用程序可以选择使用JBoss中包含的Hibernate jar,也可以打包自己的Hibernate jar副本。利用JPA的应用程序会自动将JBoss AS Hibernate注入到应用程序部署类路径中。这意味着JPA应用程序应该使用JBoss中包含的Hibernate jars作为。

但尚不清楚这是否意味着无法排除JPA依赖项,尽管排除JPA子系统是可能的。

所以,问题:

> < li>

这是否意味着排除JPA子系统对JPA应用程序不起作用?

有没有可能通过在webapp中配置jboss-deployment-structure.xml文件来排除这个hibernate-core-5 . 3 . 9 . final-red hat-00002 . jar?

JBoss EAP 7.2.1.GA中是否可以恢复默认优先级策略,使WEB-INF/lib上的jar优先于appserver中的jar?

更新1:关于排除,我们尝试在jboss-deployment-structure.xml中排除:

>

  • 所有子系统: ejb3, infinispan, jaxrs, jca, jdr, jpa, jsf, jmx, jaxrs, 远程处理, resteasy, Security-manager, security, security, Web serviceices, weld

    所有模块: javax.persistence.api, org.hibernate, org.jboss.as.jpa, javax.ejb.api, org.apache.commons.log, org.slf4j.ext, org.slf4j.ext, org.slf4j.impl, org.apache.log4j, org.jboss.as.jaxrs, org.jboss.as.jaxrs, org.jboss.resteass.resteasy.resteasy-atom-provider, org.jboss.resteasy-atom-provider, org.jboss.resteasy.resteasy-jackson- provider, org.jboss.resteasy.resteasy-jackson- provider,org.jboss.resteasy.resteasy-jsapi, org.jboss.resteasy-multipart-provider, org.jboss.resteasy-crypto, org.jboss.resteasy.jose-jwt, org.jboss.resteasy.resteasy-jettison-provider, org.jboss.resteasy.resteasy-yaml-provider, org.jboss.resteasy.skeleton-key, javaee.api, javax.activation.api, javax.epis.api, javax.el.api, javax.el.api, javax.enterprise.api, javax.inject.api, javax.拦截器.api, javax.jms.api, javax.jws.api, javax.mail.api,javax.management.j2ee.api, javax.resource.api, javax.rmi.api, javax.security.auth.message.api, javax.security.jacc.api, javax.validation.api, javax.validation.api, javax.xml.bind.api, javax.xml.soap.api, javax.xml.ws.api, javax.api

    对于两者,部署和子部署

    即使同时应用了所有这些排除,JBoss jar被注入到webapp中,所以我们仍然得到ClassCastException。

    根据官方文档中的这条评论,我对这是否像“按设计”那样工作感到困惑:使用JPA的应用程序将自动将JBoss AS Hibernate注入到应用程序部署类路径中。这意味着JPA应用程序应该使用JBoss AS中包含的Hibernate jar。或者,否则,它可以被排除,但我们缺少一些东西,或者,可能是一个bug。

    更新2。我们测试了所有这些应用程序端配置选项,没有一个单独或组合起来能够阻止JBoss hibernate jar被加载:

    在jboss-deployment-structure.xml中:

      < li >部署时排除子系统JPA < li >在子部署时排除子系统JPA < li >从无插槽部署中排除org.hibernate模块 < li >从slot main的部署中排除org.hibernate模块 < li >从插槽5.3的部署中排除org.hibernate模块 < li >从插槽5.3.9.Final的部署中排除org.hibernate模块 < li >从子部署no slot中排除org.hibernate模块 < li >从slot main的子部署中排除org.hibernate模块 < li >从插槽5.3的子部署中排除org.hibernate模块 < li >从插槽5.3.9.Final的子部署中排除org.hibernate模块 < li >从部署中排除javax.persistence.api模块 < li >从子部署中排除javax.persistence.api模块 < li >从部署中排除javax.ejb.api模块 < li >从子部署中排除javax.ejb.api模块 < li >排除部署/子部署的所有模块(servlets除外)/子系统 < li >为部署配置local-last value = " false " < li >配置true

    在persistence.xml中:

      < li >将jboss.as.jpa.providerModule配置为“应用程序” < li >将jboss.as.jpa.providerModule配置为“5 . 1 . 10” < li >将jboss.as.jpa.providerModule配置为“org . hibernate:5 . 1 . 10 . final” < li >将jboss.as.jpa.managed配置为false < li>xml配置

    maven中有几种组合和排除

  • 共有2个答案

    胡意致
    2023-03-14

    在测试了上面无数的设置组合之后,我们发现pom中有一个虚假声明,使得Manifest Dependencies变量包含

         Dependencies: org.infinispan,org.hibernate
    

    通过删除这个遗留声明,事情恢复了正常。

    最终的组合工作是:

    • 从部署中排除JPA子系统
    • 从子部署中排除JPA子系统
    • 排除javax.persistence。来自子部署的api模块

    通过此配置,我们能够排除内置的HibernateHibernate核心 5.3.9.final-redhat-00002.jar 和 JPA 2.2,并使用我们耳朵中包含的 org.hibernate.Hibernate-实体管理器:5.1.10 jar 和 JPA 2.1。

    公西承
    2023-03-14
    <?xml version='1.0' encoding='UTF-8'?>
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
      <deployment>
         <exclude-subsystems>
            <subsystem name="jpa" />
        </exclude-subsystems>
        <exclusions>
            <module name="javax.persistence.api"/>
        </exclusions>
      </deployment>
    </jboss-deployment-structure>
    

    来源:https://access.redhat.com/solutions/3332401

     类似资料:
    • 问题内容: Hibernate 3.5-Final 终于面世了,它提供了备受期待的JPA2支持以及其他功能。我正在使用JBoss 5.1.0.GA和Hibernate 3.3进行项目(基于EJB3),但是我想利用JPA2并尝试升级到Hibernate 3.5。 我所做的工作非常简单和标准-我只是将所有的hibernate3.5 jar放在server / configuration(默认,全部等)

    • 问题内容: 有人可以提供在SUSE和RedHat上安装python版本2.7所需的步骤吗?那里的版本大约是2.4,为了使我的脚本正常工作,我至少需要2.6。因此,安装后,我可以在xTerm中键入Python并获取Python 2.7命令行界面。 问题答案: 下载源和安装说明: https://www.python.org/download/ 注意:您应该检查python 2.7.x的最新版本,因为

    • 我有一个gradle项目,它有以下依赖关系: 并具有以下应用Spring Boot插件的功能: 我遇到的问题是,当我包含Spring Boot插件时,一个旧版本的hibernate内核似乎正在导入到我的项目中(5.0.12.Final)。但我的代码使用的是5.2.12。最终的hibernate核心库。 我不能确切地理解为什么hibernate核心库附带Spring引导插件,因为我看不到它在mave

    • 问题内容: 关于谷歌搜索,可以找到很多东西,但是我还没有找到解决这个问题的可行方法。 基本上,我想按需加载的特定类上有一个很大的CLOB。天真的方法是: 但是,这不起作用,显然是由于我使用的是oracle驱动程序,即Lob对象没有被视为简单的句柄,而是始终被加载。如此一来,我就被我的尝试所吸引。有一种解决方案使用特殊的工具来进行惰性属性加载,但是由于Hibernate文档似乎表明他们对使它正常工作

    • 未将hibernate-cfg.xml添加到war classes文件夹中。我使用以下脚本将web applcation部署到tomcat。复制后,当我启动tomcat时,错误enotFoundException下面的gettign:类路径资源[hibernate.cfg.xml]无法解析URL,因为它不存在

    • 我无法在hibernate中急切地加载多态相关对象。我知道默认的FetchType渴望@Any,但我不能急于加载字段。下面是一段代码片段: 当我从hibernate通过id获取它时,会出现延迟初始化异常。我不明白为什么会这样。谁能帮忙吗?