我有一个 war 应用程序,其中包含使用 Spring 容器打包和引导的 JPA 2.1 API 和 Hibernate 4.3.0.Final(JPA 2.1 实现),我想将其部署在 JBoss EAP 6.1 中。
我知道 JBoss EAP 6.1 符合 JPA 2.0 标准,因此我决定强制 JBoss 在我的应用程序中使用 JPA 版本和实现
我试图做的是使用jboss-deployment-struction.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!)而不是战争中提供的 API jar。很明显,我在 JBoss 提供的 API (2.0) 及其中得到了不匹配的异常
在战争应用中实现(2.1)。
一个例外是,例如,注释 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 和实现?
另一种选择是迁移到 Wildfly,它是 JPA 2.1 实现,但我的问题是这在 JBoss EAP 6.1 中是否完全可能?
我们找到了另一个解决方案。
您还可以在 war 的 jboss-deployment-struct.xml 中排除 jpa 子系统:
<exclude-subsystems>
<subsystem name="jpa" />
</exclude-subsystems>
<exclusions>
<module name="javaee.api" />
</exclusions>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)