2014-01-12 4 views
11

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

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

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

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

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

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

ответ

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-развертывания-structure.xml of war:

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

Благодаря Kees, мы на самом деле переехал в Wildfly, но это может помочь кто-то. – Shailendra

+3

Почему вы должны исключить весь javaee.api? Это приводит к множеству проблем при развертывании в случае использования большего количества вещей. – andreadi

5

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

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

Опять же, мне нужен тот же вопрос, что и выше, не слишком ли сильно, чтобы исключить весь javaee.api? Есть много вещей, которые необходимы. – andreadi

3

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

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

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

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

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

4

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

Смежные вопросы