Исключить JPA 2.0 от JBoss 7.1, чтобы использовать спящий режим 4.3
Я хочу использовать hibernate 4.3 для своих функций многоуровневости в JBoss 7.1.
Мне удалось включить его в мою войну, добавив следующие строки в структуру jboss-deployment-structure
<exclusions>
<module name="org.hibernate" />
</exclusions>
и добавление зависимости для спящего ядра и менеджера объектов в моем pom.xml
Это привело к загрузке спящего режима 4.3, но, к сожалению, я получил сообщение об ошибке
java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
что связано с загрузкой JPA 2.0, когда hibernate 4.3 использует JPA 2.1
Я видел эти темы и пытался, что они предлагают
Исключение подсистемы JPA от JBoss EAP 6.1 - Попытка использования JPA 2.1 в JBoss EAP 6.1, JBoss AS7 Автоматическая загрузка JPA, Hibernate 4.3.0.Final и Spring Данные JPA 1.4.3.RELEASE.
Я добавил файл persistence.xml с
<property name="jboss.as.jpa.managed" value="false" />
исключено hibernate jpa 2.0 из Spring Данные
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring-data.version}</version>
<exclusions>
<exclusion>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Удалена подсистема JPA полностью из JBoss standalone.xml без каких-либо успехов.
Единственное, что делало трюк, заключалось в том, чтобы исключить весь javaee.api в jboss-deployment-structure, как предлагается в другом потоке
<exclusions>
<module name="javax.persistence.api"/>
<module name="javaee.api"/>
</exclusions>
но это вызывает множество проблем для остальной части моего кода.
UPDATE: теперь мой jboss-deployment-structure.xml выглядит как
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.slf4j" />
<module name="org.slf4j.impl" />
<module name="org.apache.log4j" />
<module name="javax.persistence.api" />
<module name="org.hibernate" />
</exclusions>
<dependencies>
<module name="org.jboss.ironjacamar.jdbcadapters" />
<module name="org.hornetq" />
<module name="org.hornetq.ra" />
<module name="org.jboss.ejb3" />
<module name="org.jboss.ejb-client" />
</dependencies>
</deployment>
</jboss-deployment-structure>
Как вы видите, я пробовал много вещей без везения, поэтому, если у кого-то есть другая идея, это очень приветствуется.
Ответы
Ответ 1
Я бы разделил эту проблему на два меньших:
1) Убедитесь, что вы не проходите транзитно в зависимости от JPA 2.0
Для этого вы можете использовать инструмент визуализации графиков зависимостей (у NetBeans есть один встроенный или вы можете использовать плагин дерева зависимостей maven).
Другой способ - просто пропустить файлы libs, включенные в ваш артефакт, перед тем, как приступить к JBoss.
2) Обеспечьте правильную конфигурацию JBoss AS 7.1
JBoss AS 7.1 поставляется вместе с банками Hibernate 4.0.x, чтобы обновить их, попробуйте выполнить эти шаги, как описано в официальном документе .
-
обновить текущую папку as7/modules/org/hibernate/main
, чтобы она содержала более новую версию
-
Удалить *.index файлы в папках as7/modules/org/hibernate/main
и as7/modules/org/hibernate/envers/main
-
Резервное копирование текущего содержимого as7/modules/org/hibernate
, если вы допустили ошибку
-
Удалите старые банки и скопируйте новые банки Hibernate в as7/modules/org/hibernate/main
+ as7/modules/org/hibernate/envers/main
-
Обновите as7/modules/org/hibernate/main/module.xml
+ as7/modules/org/hibernate/envers/main/module.xml
, чтобы назвать банки, которые вы скопировали в
Обновлен as7/modules/org/hibernate/main/module.xml
будет выглядеть (обратите внимание, что зависимости не изменятся):
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.hibernate">
<resources>
<resource-root path="hibernate-core-4.3.5.Final.jar"/>
<resource-root path="hibernate-commons-annotations-4.0.4.Final.jar"/>
<resource-root path="hibernate-entitymanager-4.3.5.Final.jar"/>
<resource-root path="hibernate-infinispan-4.3.5.Final.jar"/>
</resources>
<dependencies>
.
.
</dependencies>
</module>
Ответ 2
Попробуйте удалить только модуль javax.persistence.api
вместе с org.hibernate
.
Кроме того, если вы хотите переключиться на Hibernate 4.3 для всех веб-приложений (которые должны быть обратно совместимы), переключитесь на более новую версию Hibernate, как описано здесь.
Некоторые советы по отладке: после генерации ваших JAR файлов проверьте явно, какие библиотеки JPA/Hibernate они содержат (разархивируя их). Также, чтобы проверить версию Hibernate, вы можете сделать это как описано здесь.
Также проверьте структуру файл структуры jboss-deployment-structure, так как кажется, что элемент <exclusions>
не находится ни в <deployment>
, ни в элементе <sub-deployment>
.
Ответ 3
для нас помогло следующее (работает только для сценариев JPA, не связанных с контейнером!):
-
IDE-сторона: (Eclipse Kepler) удаление (добавлено во время тестов и забыто удалить) (локально установлен) JBoss 7.1.1.Final Library project Build Path dependency
-
Maven-side: (mvn 3.0.4 и 3.3.3) outcommented следующий спящий JPA 2.0, включающий раздел наш глобальный /pom.xml
(его проект уха с /pom.xml
, ear/pom.xml
, ejb/pom.xml
и web/pom.xml
:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
...
<dependencyManagement>
<dependencies>
...
<!-- outcommented because of JPA 2.1 support -->
<!--
<dependency>
<groupId>org.jboss.bom</groupId>
<artifactId>jboss-javaee-6.0-with-hibernate</artifactId>
<version>${version.jboss.bom}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
-->
</dependencies>
</dependencyManagement>
...
-
Maven-side: добавление только hibernate-entitymanager 4.3.8.Final и наш драйвер db (postgres) как зависимости от DB/ORM (который загрузите все остальные необходимые библиотеки) в нашем /ejb/pom.xml
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.3-1102-jdbc41</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
-
серверная сторона: отключить JPA 2.0 в нашем JBoss 7.1.1.Final глобально (для всех webapps/libs, если у вас несколько) настройка <module name="javax.persistence.api" export="false"/>
намеков:
- (также попробованное) портативное решение
/ear/src/main/application/META-INF/jboss-deployment-structure.xml
не может работать с JBoss 7.1.1.Final, поскольку функция <exclude-subsystem>
была добавлена в JBoss 7.1.2 позже, см.
Ответ 4
попробуйте использовать более низкую версию hibernate-entitymanager
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.6.0.Final</version>
</dependency>
и jpa 2.0 могут работать > Это сработало для меня.