ClassCastException с OpenJPA в Jboss 6.0 - PullRequest
       38

ClassCastException с OpenJPA в Jboss 6.0

1 голос
/ 04 января 2012

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

У меня есть веб-приложение с библиотекой 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] Ошибка установки при запуске: name = persistence.unit: unitName = some.war # some state = Create: 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

[Загружен javax.persistence.spi.PersistenceProviderResolverHolder $ 1 от vfs: /home/sathwik/apps/jboss-6.1.0.Final/server/default/deploy/some-webapp.war/WEB-INF/lib/openjpa -все-2.1.0.jar /]

[Загруженный javax.persistence.spi.PersistenceProvider из vfs: /home/sathwik/apps/jboss-6.1.0.Final/common/lib/hibernate-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

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

1 Ответ

3 голосов
/ 04 января 2012

Согласно странице Зависимости OpenJPA , файл openjpa-all JAR

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

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

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

...