Jboss 6自帶JPA 2.0(hibernate-jpa-2.0-api.jar
)和Hibernate 3.6.6作爲實現。在Jboss 6.0中使用OpenJPA實現ClassCastException
我有一個具有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]錯誤安裝到啓動應用程序:名稱=持久性。單元:的unitName = some.war#一些狀態=創建: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
[加載javax.persistence.spi .PersistenceProviderResolverHolder $ 1 from vfs:/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/冬眠,JPA-2.0-api.jar文件/]
從Manifest.mf
文件我是能夠收集用於編譯 hibernate-jpa-2.0-api.jar
的JDK版本編譯時Build-Jdk: 1.5.0_19
, openjpa-all-2.1.0
與Build-Jdk: 1.6.0_22
燦編譯任何人都能幫我理解爲什麼這個例外?
skaffman,謝謝你的快速回復。在部署openjpa-2.1.0.jar而不是openjpa-all後,我能夠部署應用程序。 – Sathwik 2012-01-04 11:18:33
你能解釋一下這裏的類加載器發生了什麼。爲什麼它抱怨ClassCastException。 – Sathwik 2012-01-04 11:19:39
@Sathwick:Java將從不同類加載器加載的類視爲不同的對象,即使它們具有相同的名稱和相同的字節碼。如果您嘗試在這些類之間投射一個對象,則會發生異常。對於任何給定類使用哪種類加載器都很難預測,特別是在像JBoss這樣的複雜環境中。 – skaffman 2012-01-04 11:21:47