2012-06-27 27 views
0

我想調試Sun JVM試圖加載一個未被靜態使用的類的問題我打電話的方法,並導致NoClassDefFoundError如何找到JVM試圖加載的類的列表和順序(而不是已經加載的類)

方法A.x()調用B.getTZ_OFFSET()和運行控制達到getTZ_OFFSETNoClassDefFoundErrorOraclePreparedStatement甚至在:下面詳細信息。我查看了B中的所有靜態變量和塊,其中沒有一個引用OraclePreparedStatement或者任何與此密切相關的內容。我假設只是導入類不會導致類被加載。

如何找出依賴關係,基於哪個JVM試圖加載OraclePreparedStatement

交換機-verbose:class只給出已成功加載的類的列表,而不是JVM嘗試加載的類的列表。有沒有辦法獲得這些信息?

任何幫助將不勝感激。

我知道,進口ojdbc.jar導致消失的問題,但我更感興趣的根本原因,至於爲什麼它試圖加載它擺在首位。

回答

1

JVM無法找到的類可能會在多個位置引用:在您調用的方法的參數列表中,返回類型,您正在使用的類的類(靜態)成員,任何超類的類成員和靜態初始化器。您必須檢查所有這些地方纔能找到隱藏的參考。 NoClassDefFoundError也可能會掩蓋您獲得的其他錯誤,例如創建並引用不存在的類的異常對象。

確定加載順序類的一種方法是實現您自己的類加載器。您只需要擴展Class ClassLoader並重寫方法loadClass(String,boolean),從而可以打印標準輸出請求的類的名稱,然後委託給super.loadClass(String,boolean)。