ClassCastException with OpenJPA in Jboss 6.0



Jboss 6附带了JPA 2.0 (hibernate-jpa-2.0-api.jar)和Hibernate 3.6.6作为实现。

我有一个web应用程序,有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>

当我部署应用程序时,我得到这个错误

ERROR [AbstractKernelController] ERROR install to Start: 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是从哪里加载的,它似乎是从web应用程序加载的,然后从jboss6commonlib

[javax.persistence.spi加载。$1 from vfs:/home/sathwik/apps/jboss- 6.1.0.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.0 . final/common/lib/hibernate-jpa-2.0-api.jar/]

Manifest.mf文件中,我能够收集用于编译的JDK版本hibernate-jpa-2.0-api.jarBuild-Jdk: 1.5.0_19编译,openjpa-all-2.1.0Build-Jdk: 1.6.0_22编译

谁能帮助我理解为什么这个例外?

根据OpenJPA Dependencies页面,openjpa-all JAR文件

[…包括OpenJPA核心代码以及Java SE环境的所有运行时依赖项

您不是在java环境中运行,而是在一个成熟的JavaEE环境中运行,该环境已经包含了openjpa-all JAR中包含的许多辅助API类。因此,您会遇到由于从不同的类加载器加载相同名称的类而引起的冲突。

您应该将openjpa-all替换为更具体的JAR文件(即openjpa-2.1.0.jar和其他任何必要的使其工作-参见上页)。

最新更新