2011-09-07 44 views
1

我根據類加載器的文件運行Tomcat 6.0.23,和(http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html)的webapps應該尋找類順序爲:Tomcat的類加載似乎並不表現爲記錄

  1. 引導
  2. 系統
  3. WEB-INF/classes中
  4. WEB-INF/lib目錄
  5. 常見

我有一個使用hibernate的web應用程序,而hibernate jars在它的WEB-INF/lib目錄中。當它自己運行時,一切正常。

我也有一個jar文件需要坐在tomcat/lib目錄中,因爲它包含一些需要在啓動時加載的類(一個對象工廠和它創建的對象)。這些類使用toplink來實現他們的JPA,這裏是我遇到問題的地方。

我需要把toplink jars放在tomcat啓動時可以訪問的地方,所以我把它們放在tomcat/lib目錄下。根據上面列出的類加載的順序,當使用hibernate的webapp需要hibernate實現類時,它應該在它的WEB-INF/lib目錄中找到它們,但實際發生的是它從tomcat/lib中找到了toplink實現類目錄,並且我得到一個類轉換異常。

任何人都可以請解釋爲什麼我的Web應用程序類沒有找到他們需要在他們的WEB-INF/lib目錄,或建議一種方法來在運行時調試類路徑?

謝謝。

+0

很肯定存在着階級在Tomcat的/ lib目錄覆蓋由Hibernate需要以及一些類。所以你最終可能會得到同一類的不同字節碼版本,從而導致Hibernate失敗。檢查重複類名和/或重新設計... – home

回答

2

請務必閱讀和理解的段落,你引用了前面列表中:

「當一個請求加載從Web應用程序的WebappX類加載器類進行處理,這個類加載器會在本地資源庫第一,而不是在查找之前進行委託,也有例外,作爲JRE基類的一部分的類不能被重寫,對於某些類(例如J2SE 1.4+中的XML解析器組件),可以使用J2SE 1.4認可的功能。

什麼是您遇到問題的「hibernate實現類」? (Hibernate的「實現」類將與Toplink完全不同。)它們是否是javax.persistence類?這些可能(或可能不)屬於「JRE基類」,它們的行爲有所不同。

編輯:根據您的評論,這只是一個典型的跨類加載器加載問題。 Tomcat的類加載正如您所期望的那樣工作。如果你看看JPA類,其中這個初始化是怎麼回事,你會發現這樣一行:

Enumeration<URL> resources = 
    cl.getResources("META-INF/services/" + PersistenceProvider.class.getName()); 

加載所有的ClassLoader所有 PersistenceProviders,包括你的Toplink一個lib目錄。然後立即執行此操作:

for (PersistenceProvider provider : providers) { ... 

這就是javax.persistence.Persistence的第77行,您的異常來自其中。這是因爲提到了該行的PersistenceProvider類類是從你的web應用的類加載器,但集合包含兩個實例:從同一個類加載器,並從不同的類加載器TopLink的一個你的Hibernate實現。

這個全球性的,靜態初始化是多數民衆贊成讓我從轉移到JPA一個重大的事情。因爲這樣的問題,我仍然只是使用直接的Hibernate。

+0

確切的例外,我得到的是如下。 javax.persistence類是否屬於上面列出的例外類別?我們在tomcat 5.5的common/lib路徑中設置了toplink安裝(沒有任何使用hibernate的情況),沒有問題。 java.lang.ClassCastException:oracle.toplink.essentials.PersistenceProvider不能轉換到javax.persistence.spi.PersistenceProvider \t在javax.persistence.Persistence $ 1.isLoaded(Persistence.java:77) \t在org.hibernate.validator .engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:33) – ssloan

+0

@ssloan:更新我的答案。 –

+0

感謝您的解釋!現在發生的事情很有意義。 – ssloan