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.jar
用Build-Jdk: 1.5.0_19
编译,openjpa-all-2.1.0
用Build-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
和其他任何必要的使其工作-参见上页)。