Подтвердить что ты не робот

Исключая подсистему JPA от JBoss EAP 6.1 - Пытаясь использовать JPA 2.1 в JBoss EAP 6.1

У меня есть военное приложение, которое содержит API JPA 2.1 и Hibernate 4.3.0.Final(реализация JPA 2.1), упакованные и загруженные с использованием контейнера Spring, и я хочу развернуть это в JBoss EAP 6.1.

Я знаю, что JBoss EAP 6.1 является совместимым с JPA 2.0, поэтому я решил заставить JBoss использовать версию JPA и реализацию из моего приложения

То, что я пытался сделать, это исключить подсистему JPA с помощью jboss-deployment-structure.xml, но я обнаружил, что даже если я прокомментирую расширение JPA и подсистему JPA от standalone.xml и исключу подсистемы JPA в jboss -deployment-structure.xml(также исключается модуль org.hibernate для использования спящего режима, упакованного в приложение), сканеры JPA не выполняются (как ожидалось), но в любой момент из военного класса (в моем случае Spring) относится к классам javax.persistence, API загружается из модулей JBoss (modules/system/layers/base/javax/persistence/api/main/hibernate-jpa-2.0-1.0.1.Final-redhat -2.jar!) INSTEAD из контейнера API, поставляемого в поставляемой войне. Поэтому, очевидно, я получаю исключение из-за несоответствия в API-интерфейсе JBoss (2.0) и его (2.1) в военном применении. Одним из исключений является, например, связанное с индексом свойство аннотации javax.persistence.Table не распознается, поскольку это добавление в JPA 2.1 и недоступно в JPA 2.0

Я мог бы обойти эту проблему, заменив JPA 2.0 API в каталоге модулей JPA 2.1 (и указав module.xml на новую банку API 2.1), и все сработало нормально. Однако я думаю, что это не правильный путь, поскольку это похоже на попытку изменить поведение сервера для всех приложений.

Является ли это преднамеренным поведением JBoss для загрузки классов, что все классы API спецификации (из которых JBoss является разработчиком) всегда будут иметь приоритет независимо от того, что используется в реализации, и независимо от того, что мы говорим ему использовать конкретный API из приложения. Я думаю, что создание конкретного сервера, совместимого со спецификациями, и предоставление способ переопределения самой версии спецификации несколько противоречив, но есть ли способ, с помощью которого я могу чисто использовать API и реализацию из моего приложения?

Другим вариантом было бы перейти на Wildfly, который является реализацией JPA 2.1, но мой вопрос заключается в том, насколько это возможно в JBoss EAP 6.1?

4b9b3361

Ответ 1

Мы нашли другое решение.
Вы также можете исключить подсистему jpa в jboss-deployment-structure.xml войны:

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

Ответ 2

Если вы 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>

Ответ 3

Нашел решение, которое, похоже, работает с hibernate-core-4.3.1.

Шаг 1: удалите подсистему jpa из standalone.xml:

    <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: исключить jpa, javaee модули в jboss-deployment-structure.xml войны:

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

Ответ 4

Вышеупомянутые ответы велики, но они во многих приложениях вводят другие проблемы, исключая весь Java EE API.

Если вы не хотите этого делать, перейдите к JBOSS_HOME\modules\javaee\api\main\module.xml и установите для экспорта значение false для javax.persistence.api, например:

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

Обратите внимание, что это отключит API персистентности для каждого приложения, развернутого в одном и том же EAP.

Вам все равно нужно удалить подсистему JPA с standalone.xml, но вам не нужно менять jboss-deployment-structure.xml или, по крайней мере, мне не нужно.