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


我有一个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-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!)在提供的战争中提供的API jar的INSTEAD。所以很明显我得到了JBoss提供的API(2.0)及其不匹配的例外 在战争申请中实施(2.1)。 一个例外是例如注释javax.persistence.Table的索引相关属性无法识别,因为这是JPA 2.1中的一个附加项,在JPA 2.0中不可用

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

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

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


9756
2018-01-12 18:23


起源



答案:


我们发现另一个解决方
您还可以在war的jboss-deployment-structure.xml中排除jpa子系统:

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

5
2018-04-25 09:52



我想再次提出与上述相同的问题,是不是要彻底排除整个javaee.api?那里有很多东西需要。 - andreadi


答案:


我们发现另一个解决方
您还可以在war的jboss-deployment-structure.xml中排除jpa子系统:

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

5
2018-04-25 09:52



我想再次提出与上述相同的问题,是不是要彻底排除整个javaee.api?那里有很多东西需要。 - andreadi


如果你是Maven,这对我有用。

<dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
    </dependency>

JBoss的部署,structure.xml

<deployment>

    <exclude-subsystems>
        <subsystem name="jpa" />
    </exclude-subsystems>

    <exclusions>
        <module name="javaee.api" />
    </exclusions>

</deployment>


4
2017-12-06 22:26





找到了一个似乎与hibernate-core-4.3.1一起使用的解决方案。

第1步:从standalone.xml中删除子系统jpa:

    <subsystem xmlns="urn:jboss:domain:jpa:1.1">
        <jpa default-datasource="" default-extended-persistence-inheritance="DEEP"/>
    </subsystem>

感谢这篇博客文章: http://mariemjabloun.blogspot.nl/2014/02/jboss-eap-6-persistence-unit-problem.html

第2步:在war的jboss-deployment-structure.xml中排除jpa,javaee模块:

    <exclusions>
        <module name="javax.persistence.api"/>
        <module name="javaee.api"/>
    </exclusions>

3
2018-03-04 08:32



谢谢基斯,我们实际上转移到了Wildfly,但这可能对某人有所帮助。 - Shailendra
你为什么要排除整个javaee.api?如果使用更多的东西,这会导致部署中的许多问题。 - andreadi


上面的答案很棒,但它们通过排除整个Java EE API在许多应用程序中引入了其他问题。

如果你不想这样做,那就去吧 JBOSS_HOME\modules\javaee\api\main\module.xml 并将导出设置为false javax.persistence.api, 喜欢这个:

<module name="javax.persistence.api" export="false"/>

请注意,这将禁用部署在同一EAP中的每个应用程序的持久性API。

您仍然需要从中删除JPA子系统 standalone.xml,但你不需要改变 jboss-deployment-structure.xml,或者至少我没有。


3
2017-07-22 08:51