此問題相比與ClassNotFoundException,不容易找到,當然這兩者都屬於jvm加載類時的錯誤。導致
NoClassDefFoundException的原因:編譯時不報錯,運行時在內存中找不到該類的對象。也正是這個原因,導
致不好找到,深層次的原因我們得分析jvm加載機制,這個我會在下篇文章中發表個人愚見,這里我們就描述一
些我們實際開發中,由於我們的哪些疏忽導致此問題出現。看到網上好多出現此類問題,如:靜態變量初始化找
不到指定文件;代碼順序問題,但我這邊寫了測試類均沒有復現,所以此處不做說明,等遇到后再更新文檔。
場景:我們明明下載了三方jar,然后加入到構建路徑,然后重新編譯后,也不報錯。但為何運行的時候,
就是提示NoClassDefFoundException這個錯誤。其根本原因就是:引入的jar包沒有在當前jar文件的
manifest文件中的classpath屬性中定義!!!
add by weipt 20190713 還有一種情況就是,當前引入的包,沒有在Import_Pachage標簽下注冊
這個根據我們實際框架來看,就拿OSGI舉例:其MANIFEST.MF文件中Bundle-ClassPath屬性,需要我們
在引入三方jar包后,在此文件中添加,有的ide會自動添加。沒有的話我們就需要手動添加。
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Weipt_TEST
Bundle-SymbolicName: Weipt_TEST;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-ClassPath: .,
lib/dom4j-1.6.1.jar,
lib/org.jdom_1.0.0.v200806100616.jar,
lib/jsch-0.1.55.jar
Bundle-Activator: com.dcfs.queue.app.Activator
Junit-Test: com.dcfs.teller.common.test.MainTest
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
歡迎指正或者補充,您的建議是我們共同進步的階梯