升級libraries引起的異常NoClassDefFoundError

對現有的rcp工程替換了一個jar包,只是做了版本升級,從6.0.0升級至6.0.1,但是出現了以下錯誤。
問題報錯信息如下:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '*****' defined in class path resource [*******.xml]: Instantiation of bean failed
 nested exception is java.lang.NoClassDefFoundError: ***************

編譯的時候一切正常,但是在運行的時候報錯,拋出的異常爲java.lang.ClassNotfoundException, 但是實際的cause by 提示爲java.lang.NoClassDefFoundError。跟蹤堆棧信息發現,實際的異常是在運行時加載器加載文件的時候拋出的,並且被包裝成了java.lang.ClassNotfoundException異常。

排查的時候發現,替換的jar包名稱發生了變化,原先爲AAA_6.0.0.jar,現在成了aaa-6.0.1.jar。在編譯的時候,根據MAINFEST.MF中的Export-Package配置來獲取對應的class文件,並不會關注jar包本身的名稱,也不會調用加載器來加載文件,但是運行的時候會調用加載器來加載對應的文件,此時會優先查看.classpath中使用的jar包,然後再去加載對應的類。雖然運行的時候也會編譯,但是前提是能夠通過.classpath找到對應的jar包才行。

需要注意的是,windows系統本身是大小寫不敏感的,但是編譯和運行的時候是大小寫敏感的,如果jar包名稱爲a.jar,那麼在windows中是不能直接再複製一個A.jar到同一目錄下的,但是在.classpath中配置的a.jar和A.jar是兩個完全不一樣的jar包。

還有一種情況就是,工程直接依賴的jar包A本身又依賴其他的jar包B、C、D等等。但是隻要添加了A,工程就可以編譯,運行的話必須添加剩餘的jar包,否則也會上報NoClassDefFoundError異常。

此外,ClassNotfoundException是確實沒有這個文件,一般在編譯的時候就報錯了,NoClassDefFoundError在編譯的時候不會報錯,但是運行的時候會報錯。對於一些項目一般是直接運行,不會單獨去做編譯操作,因此排查錯誤的時候要看下具體的報錯信息(不建議在開發過程中自行封裝系統已有異常)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章