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
任何人都可以帮助我理解为什么会出现这种异常吗?
答案 0 :(得分:3)
根据OpenJPA Dependencies page,openjpa-all
JAR文件
[...]包括OpenJPA核心代码以及Java SE环境的所有运行时依赖性
您没有在JavaSE环境中运行,您处于一个成熟的JavaEE环境中,该环境已经包含openjpa-all
JAR中包含的许多辅助API类。因此,您会遇到因加载同名类但来自不同类加载器而导致的冲突。
您应该将openjpa-all
替换为更具体的JAR文件(即openjpa-2.1.0.jar
以及其他任何必要的JAR文件 - 请参阅上页。)