gpt4 book ai didi

spring - 从 JBoss EAP 6.1 中排除 JPA 子系统 - 尝试在 JBoss EAP 6.1 中使用 JPA 2.1

转载 作者:IT老高 更新时间:2023-10-28 13:46:20 25 4
gpt4 key购买 nike

我有一个包含 JPA 2.1 API 和 Hibernate 4.3.0.Final(JPA 2.1 实现)的 war 应用程序,使用 Spring 容器打包和引导,我想在 JBoss EAP 6.1 中部署它。

我知道 JBoss EAP 6.1 与 JPA 2.0 兼容,所以我决定强制 JBoss 在我的应用程序中使用 JPA 版本和实现

我试图做的是使用 jboss-deployment-structure.xml 排除 JPA 子系统,但我发现即使我从standalone.xml 中注释掉 JPA 扩展和 JPA 子系统并将 JPA 子系统排除在 jboss -deployment-structure.xml(也排除了 org.hibernate 模块以使用应用程序中打包的 hibernate),没有运行 JPA 扫描程序(如预期的那样)但是任何 war 类的时刻(在我的情况下Spring 容器)是指 javax.persistence 类,API 从 JBoss 模块(modules/system/layers/base/javax/persistence/api/main/hibernate-jpa-2.0-1.0.1.Final-redhat-2 .jar!)代替 war 中提供的 API jar。所以很明显我在 JBoss 提供的 API (2.0) 和它的 war 应用中的实现(2.1)。一个异常(exception)是,例如,注释 javax.persistence.Table 的索引相关属性无法识别,因为这是 JPA 2.1 中的新增功能,在 JPA 2.0 中不可用

我可以通过将模块目录中的 JPA 2.0 API 替换为 JPA 2.1(并将 module.xml 指向新的 2.1 API jar)来解决此问题,并且一切正常。但是我认为这不是正确的方法,因为这就像尝试更改所有应用程序的服务器行为一样。

这是有意的 JBoss 类加载行为吗,所有规范 API 类(其中 JBoss 是实现者)将始终优先,无论使用的实现是什么,也无论我们告诉它使用应用程序中的特定 API。我认为制作一个符合特定规范的服务器,然后提供覆盖规范版本本身的方法有些矛盾,但有没有一种方法可以让我在我的应用程序中干净地使用 API 和实现?

另一个选择是迁移到 JPA 2.1 实现的 Wildfly,但我的问题是这在 JBoss EAP 6.1 中是否完全可行?

最佳答案

我们找到了另一个解决方案。
也可以在war的jboss-deployment-structure.xml中排除jpa子系统:

<exclude-subsystems>
<subsystem name="jpa" />
</exclude-subsystems>
<exclusions>
<module name="javaee.api" />
</exclusions>

关于spring - 从 JBoss EAP 6.1 中排除 JPA 子系统 - 尝试在 JBoss EAP 6.1 中使用 JPA 2.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21078551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com