【问题标题】:ClassCastException with OpenJPA in Jboss 6.0Jboss 6.0 中带有 OpenJPA 的 ClassCastException
【发布时间】:2012-02-02 06:54:52
【问题描述】:

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 中设置了类加载器隔离,如下所示

<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] 安装到开始时出错: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.jarBuild-Jdk: 1.5.0_19 编译, openjpa-all-2.1.0 编译成Build-Jdk: 1.6.0_22

谁能帮我理解为什么会出现这个异常?

【问题讨论】:

    标签: java classloader jboss6.x openjpa


    【解决方案1】:

    根据OpenJPA Dependencies pageopenjpa-all JAR 文件

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

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

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

    【讨论】:

    • skaffman,感谢您的快速回复。在部署 openjpa-2.1.0.jar 而不是 openjpa-all 后,我能够部署应用程序。
    • 你能解释一下类加载器发生了什么吗?为什么它会抱怨 ClassCastException。
    • @Sathwick:Java 将不同类加载器加载的类视为不同的类,即使它们具有相同的名称和相同的字节码。如果您尝试在这些类之间强制转换对象,则会出现异常。很难预测任何给定类使用哪个类加载器,尤其是在 JBoss 等复杂环境中。
    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多