2012-01-04 71 views
1

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_19openjpa-all-2.1.0Build-Jdk: 1.6.0_22

燦編譯任何人都能幫我理解爲什麼這個例外?

回答

3

按照OpenJPA Dependencies page,該openjpa-all JAR文件

[...]包括OpenJPA的核心代碼加上所有運行時依賴對Java SE的環境

你沒有運行在JavaSE環境中,您處於成熟的JavaEE環境中,其中已經包含許多openjpa-all JAR中包含的輔助API類。因此,您會因加載具有相同名稱的類而導致衝突,但會導致來自不同類加載器的衝突。

你應該有更具體的JAR文件替換openjpa-all(即openjpa-2.1.0.jar和讓別人是必要的,使其工作 - 看到上面的頁面)。

+0

skaffman,謝謝你的快速回復。在部署openjpa-2.1.0.jar而不是openjpa-all後,我能夠部署應用程序。 – Sathwik 2012-01-04 11:18:33

+0

你能解釋一下這裏的類加載器發生了什麼。爲什麼它抱怨ClassCastException。 – Sathwik 2012-01-04 11:19:39

+1

@Sathwick:Java將從不同類加載器加載的類視爲不同的對象,即使它們具有相同的名稱和相同的字節碼。如果您嘗試在這些類之間投射一個對象,則會發生異常。對於任何給定類使用哪種類加載器都很難預測,特別是在像JBoss這樣的複雜環境中。 – skaffman 2012-01-04 11:21:47