2013-10-10 22 views
0

上下文是這樣的:我有所有靜態方法和靜態初始化塊的類。這個類是一個Web應用程序的一部分,該應用程序打包爲一個戰爭並部署在WebSphere 10內部。該類已被加載/使用後,是否可以引發NoClassDefFoundError?

有些情況下戰爭中的其他類試圖調用此類上的方法,但僅得到NoClassDefFoundError。我覺得奇怪的是,從日誌中我可以看到類的方法等已經成功調用了多次,但突然之間,一個相同的(以前成功的)方法調用目前會生成一個NoClassDefFoundError。此時,對該類的靜態方法的任何未來調用都將生成該錯誤(直到WebSpehere容器重新啓動或重新部署戰爭)。

讓我感到困惑的是,爲什麼這個類似乎在拋出NoClassDefFoundError之前工作了一段時間。 documentation對這個例外說:

當編譯當前正在執行的類時存在搜索到的類定義,但不能再找到定義。

所以我的問題是,一個類怎麼可用一段時間,清楚地響應對其靜態方法的調用,然後拋出NoClassDefFoundError?

+1

我會看看到自定義的類裝載器/你正在使用你的Web應用程序代理。如果加載類的類加載器不再是加載器層次結構的一部分(例如,如果您使用自定義類加載器並且存在某種錯誤),那麼可能會發生這些錯誤。 – Matthias

+0

@Matthias它只是一個普通的WebSphere 10.3.3,沒有爲其類加載器或類似的東西做定製。 –

回答

1

NoClassDefFoundError其不是ClassNotFoundException。當它可以發生:作爲創建新實例的部分使用

當Java虛擬機或ClassLoader實例試圖 負載類的定義時,拋出(作爲通常方法調用的一部分或者 新的表達式)和沒有 的類的定義可以找到。

我的經驗表明,如果在靜態初始化塊中出現異常,這個異常也會被拋出。

Why NoClassDefFoundError caused by static field initialization failure?

+0

是的,但我的問題是:即使在該類的靜態初始化塊成功執行後,如何進入NoClassDefFoundError情況,甚至是該類的某些成功的靜態方法調用。難道我們不是經過這一點,是不是已經成功找到並加載了類定義? –

+0

@ShivanDragon我現在看到。你是對的我首先想念你的問題。也許你有一些類加載器問題?我根本不熟悉WebSphere。看看這篇文章,也許你可以找到一些有用的東西http://www.javacodegeeks.com/2012/06/javalangnoclassdeffounderror-how-to.html – smajlo

+0

謝謝,這是非常有用的,儘管最後一句話讓我有點傷心: 「請注意,諸如Oracle Weblogic之類的Java EE容器有機制來覆蓋這種默認的類加載器委託行爲,我將在以後的文章中回顧這一點。」 :(((( –

相關問題