2017-05-12 99 views
0

我正在NoClassDefFoundError的異常的詭異的案子。我的應用程序部署在WebLogic 12c上,並在那裏運行了好幾個月。在其中一個類中,我正在對JAR中包含的方法進行靜態調用,該JAR位於我的託管服務器的類路徑中。一切都很好,直到突然之間我開始爲那個特定的課程獲得「NoClassDefFoundError」。我的JAR沒有改變,調用類沒有改變,類路徑也沒有改變。我通過JVisualVM檢查了CLASSPATH,並且我的JAR文件在那裏。奇怪的NoClassDefFoundError例外

我想知道是否有任何方法來找出它通過Java實用程序或其他工具發生的原因。

+1

如果有一兩件事是可以幫助找出問題,這是異常的完整堆棧跟蹤。 –

+0

如果你確定你沒有意外觸及任何東西,那麼我會說它看起來像是一個內部的JVM類加載器錯誤。這裏的另一個傢伙這個問題,它似乎非常罕見的,難以調試:https://coderanch.com/t/556782/java/Suddenly-java-lang-NoClassDefFoundError –

+0

是的,100%確保沒有被改變,驗證了好倍。感謝您的參考。 – user7363133

回答

0

如果它已經運行了很長時間,那麼包含靜態方法和類定義的PermGen內存可能會收集垃圾收集該類定義,以便用其他方法替換它。一旦你嘗試調用靜態方法,該類將再次被初始化,但是如果在初始化失敗的時候(例如,你從一個靜態方法中分配一個靜態字段的值,最終拋出一個異常),那麼這個類將贏得'不要初始化,當你嘗試訪問它時,你會得到一個NoClassDefFoundError

+0

那麼,被管理的服務器正在經常被反彈,至少每週幾次,而其他開發者更新其實現。 – user7363133

+0

這可能發生的另一種方式是,如果該類的依賴項未能初始化。即使你不會調用失敗的類,由於依賴不存在,它會再次拋出一個'NoClassDefFoundError異常 – Konstantine