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
Может кто-нибудь поможет мне понять, почему это исключение?
skaffman, спасибо за ваш быстрый ответ. Я смог развернуть приложение после развертывания openjpa-2.1.0.jar вместо openjpa-all. – Sathwik
Можете ли вы объяснить, что происходит с загрузчиком классов. Почему он жалуется на ClassCastException. – Sathwik
@Sathwick: Java рассматривает классы, загружаемые из разных загрузчиков классов, как разные, даже если они имеют одинаковое имя и один и тот же байт-код.Если вы попытаетесь создать объект между этими классами, вы получите исключение. Какой классный загрузчик используется для любого заданного класса, его трудно предсказать, особенно в сложных средах, таких как JBoss. – skaffman