Java JBoss6.0中带有OpenJPA的ClassCastException
JBoss6附带了JPA2.0(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
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这样的复杂环境中。