錯誤簡述
不久前,在開發過程中,將寫好的項目A編譯成jar包,放到其他的項目上用的時候(直接引用,而不是使用依賴管理工具),出現如下的錯誤:
錯誤的全稱:java.lang.NoClassDefFoundError,這是一個運行時錯誤,在編譯的時候並不發生。困擾了我好一會兒。
解決方法
原來是原來是項目A編譯成的jar包所依賴的jar包不存在。添加就可以了。
詳細一點
NoClassDefFoundError錯誤的發生,是因爲Java虛擬機在編譯時能找到合適的類,而在運行時不能找到合適的類導致的錯誤。例如在運行時我們想調用某個類的方法或者訪問這個類的靜態成員的時候,發現這個類不可用,此時Java虛擬機就會拋出NoClassDefFoundError錯誤。簡單總結就是,NoClassDefFoundError發生在編譯時對應的類可用,而運行時在Java的classpath路徑中,對應的類不可用導致的錯誤。
發生錯誤可能的原因如下:
- 對應的Class在java的classpath中不可用
- 你可能用jar命令運行你的程序,但類並沒有在jar文件的manifest文件中的classpath屬性中定義
- 可能程序的啓動腳本覆蓋了原來的classpath環境變量
- 因爲NoClassDefFoundError是java.lang.LinkageError的一個子類,所以可能由於程序依賴的原生的類庫不可用而導致
- 檢查日誌文件中是否有java.lang.ExceptionInInitializerError這樣的錯誤,NoClassDefFoundError有可能是由於靜態初始化失敗導致的
- 如果你工作在J2EE的環境,有多個不同的類加載器,也可能導致NoClassDefFoundError
如果想了解更多關於NoClassDefFoundError的發生機制和解決方法,可以參考下面這篇blog:
http://blog.csdn.net/angel_g/article/details/54235701
本篇blog的部分內容也是來自於這篇blog, 特在此聲明。
end