在Jboss 6.0中使用OpenJPA的ClassCastException

时间:2012-01-04 11:03:11

标签: java classloader jboss6.x openjpa

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

我有一个包含OpenJPA 2.0库(openjpa-all-2.1.0.jar)的Web应用程序。我在jboss-web.xml中设置了classloader隔离,如下所示

<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]安装到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应用程序加载的第一,然后从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使用Build-Jdk: 1.5.0_19编译, openjpa-all-2.1.0使用Build-Jdk: 1.6.0_22

进行编译

任何人都可以帮助我理解为什么会出现这种异常吗?

1 个答案:

答案 0 :(得分:3)

根据OpenJPA Dependencies pageopenjpa-all JAR文件

  

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

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

您应该将openjpa-all替换为更具体的JAR文件(即openjpa-2.1.0.jar以及其他任何必要的JAR文件 - 请参阅上页。)