2012-01-04 2 views
1

Jboss 6 поставляется с JPA 2.0 (hibernate-jpa-2.0-api.jar) и Hibernate 3.6.6 в качестве реализации.ClassCastException с OpenJPA в Jboss 6.0

У меня есть веб-приложение с библиотекой OpenJPA 2.0 (openjpa-all-2.1.0.jar). Я устанавливал изоляцию загрузчика классов в JBOSS-web.xml, как показано ниже

<class-loading java2ClassLoadingCompliance="false"> 
    <loader-repository> 
     some.example:loader=some-webapp.war 
     <loader-repository-config>java2ParentDelegation=false</loader-repository-config> 
    </loader-repository> 
</class-loading> 

Когда я развертывание приложения я получаю эту ошибку

ОШИБКИ [AbstractKernelController] Ошибки при установке на старт: имя = настойчивость .unit: UnitName = some.war # некоторое состояние = Создать: java.lang.ClassCastException: org.apache.openjpa.persistence.PersistenceProviderImpl не может быть приведен к javax.persistence.spi.PersistenceProvider

Это странно, так как , org.apache.openjpa.persistence.PersistenceProviderImpl уже реализует javax.persistence.spi.PersistenceProvider

Я сделал -version:class, чтобы проверить, где javax.persistence.spi.PersistenceProvider загружается из и, кажется, что он загружается с веб-приложения, а затем из jboss6\common\lib

[Loaded javax.persistence.spi .PersistenceProviderResolverHolder $ 1 из vfs: /home/sathwik/apps/jboss-6.1.0.Final/server/default/deploy/some-webapp.war/WEB-INF/lib/openjpa-all-2.1.0.jar/]

[Загружено javax.persistence.spi.PersistenceProvider from vfs: /home/sathwik/apps/jboss-6.1.0.Final/common/lib/ Зимуют-JPA-2,0-api.jar /]

Из файла Manifest.mf я был в состоянии собрать версию JDK, используемый для компиляции hibernate-jpa-2.0-api.jar скомпилирован с Build-Jdk: 1.5.0_19, openjpa-all-2.1.0 скомпилирован с Build-Jdk: 1.6.0_22

Может кто-нибудь поможет мне понять, почему это исключение?

ответ

3

Согласно OpenJPA Dependencies page, файл openjpa-all JAR

[...] включает в себя основной код OpenJPA плюс все зависимости времени выполнения для Java SE сред

Вы не работаете в среде JavaSE вы находитесь в полномасштабной среде JavaEE, в которой уже есть много вспомогательных классов API, содержащихся в JAR openjpa-all. В результате возникают конфликты, вызванные загрузкой классов с тем же именем, но из разных загрузчиков классов.

Вы должны заменить openjpa-all более конкретными JAR-файлами (то есть openjpa-2.1.0.jar и любыми другими, необходимыми для его работы - см. Вышеприведенную страницу).

+0

skaffman, спасибо за ваш быстрый ответ. Я смог развернуть приложение после развертывания openjpa-2.1.0.jar вместо openjpa-all. – Sathwik

+0

Можете ли вы объяснить, что происходит с загрузчиком классов. Почему он жалуется на ClassCastException. – Sathwik

+1

@Sathwick: Java рассматривает классы, загружаемые из разных загрузчиков классов, как разные, даже если они имеют одинаковое имя и один и тот же байт-код.Если вы попытаетесь создать объект между этими классами, вы получите исключение. Какой классный загрузчик используется для любого заданного класса, его трудно предсказать, особенно в сложных средах, таких как JBoss. – skaffman

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