Java JBoss6.0中带有OpenJPA的ClassCastException

Java JBoss6.0中带有OpenJPA的ClassCastException,java,classloader,jboss6.x,openjpa,Java,Classloader,Jboss6.x,Openjpa,JBoss6附带了JPA2.0(hibernate-JPA-2.0-api.jar)和Hibernate3.6.6作为实现 我有一个包含OpenJPA2.0库(OpenJPA-all-2.1.0.jar)的web应用程序。我在jboss-web.xml中设置了类加载器隔离,如下所示 <class-loading java2ClassLoadingCompliance="false"> <loader-repository> so

JBoss6附带了JPA2.0(
hibernate-JPA-2.0-api.jar
)和Hibernate3.6.6作为实现

我有一个包含OpenJPA2.0库(OpenJPA-all-2.1.0.jar)的web应用程序。我在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>

some.example:loader=some-webapp.war
java2ParentDelegation=false
当我部署应用程序时,我得到了这个错误

错误[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
从何处加载,它似乎是先从web应用程序加载,然后从
jboss6\common\lib

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

[从vfs加载javax.persistence.spi.PersistenceProvider:/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
是用
buildjdk:1.5.019
编译的,
openjpa-all-2.1.0
是用
buildjdk:1.6.0_22

有人能帮我理解为什么会出现这种异常吗?

根据
openjpaall
JAR文件

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

您不是在JavaSE环境中运行,而是在一个成熟的JavaEE环境中运行,
openjpa all
JAR中已经包含了许多辅助API类。因此,加载同名但来自不同类加载器的类会导致冲突


您应该用更具体的JAR文件(即,
openjpa-2.1.0.JAR
和使其工作所需的任何其他文件替换
openjpa all

skaffman,感谢您的快速回复。在部署openjpa-2.1.0.jar而不是openjpa-all之后,我就能够部署应用程序了。您能解释一下类加载器在这里发生了什么吗。为什么会抱怨ClassCastException。@Sathwick:Java将从不同类加载器加载的类视为不同的类,即使它们具有相同的名称和字节码。如果尝试在这些类之间强制转换对象,则会出现异常。对于任何给定的类,使用哪个类加载器是很难预测的,特别是在像JBoss这样的复杂环境中。