java.lang.NoClassDefFoundError:如何解决–第1部分
我向您建議的一系列文章將為您提供有關如何解決和解決此類問題的逐步方法。 我還將分享我在過去10年中觀察到的最常見的Java NoClassDefFoundError問題模式。 還將提供示例Java程序,以簡化您的學習過程。 我也鼓勵您發表評論,分享您的問題案例,并就此問題向我提出任何問題。
該系列的第1部分將重點概述此Java運行時錯誤以及Java ClassLoader概述。
java.lang.NoClassDefFoundError –這是什么?
現在讓我們開始對此問題進行簡單的概述。 當ClassLoader嘗試加載類的定義( 在您的應用程序代碼等中引用的類)并且在當前ClassLoader樹中找不到此類定義時,JVM會拋出此運行時錯誤。
基本上,這意味著此類Class定義是在編譯時找到的,而在runtime時找不到的。
很簡單,如何將缺少的類添加到類路徑中呢?
嗯,不是那么快,這種類型的問題并不是那么容易解決。 將缺少的Class / JAR添加到運行時應用程序classpath / ClassLoader只是許多可能的解決方案之一。 關鍵是首先執行適當的根本原因分析。 這就是為什么我要創建整個系列。
現在,只需記住,這個錯誤并不一定意味著你缺少從你的“期望”類路徑或ClassLoder這個類定義,所以請不要認為在這一點上任何東西。
Java ClassLoader概述
在繼續進行之前,對Java ClassLoader原理有很高的了解是非常重要的。 經常調試NoClassDefFoundError問題的人很掙扎,因為他們缺乏對Java ClassLoader原理的正確了解和理解。 阻止他們查明根本原因。
類加載器是負責加載類的Java對象。 基本上,類加載器會嘗試查找或生成構成該類定義的數據。 要理解的關鍵點之一是,默認情況下,Java類加載器使用委托模型來搜索類。 每個ClassLoader實例都有一個關聯的父類加載器。 因此,假設您的應用程序類加載器需要加載類A。它將嘗試做的第一件事是,在嘗試查找類A本身之前,將對類A的搜索委托給其父類加載器。 您最終可以得到一個大型類加載器鏈,其中包含許多父類加載器,直至JVM系統類路徑引導類加載器。
問題是什么? 好吧,如果從某個特定的父類加載器中找到了A類,那么如果希望應用程序(子類)加載A類,則該父類將為NoClassDefFoundError打開大門。 例如,第三方JAR文件依賴項只能存在于您的應用程序子類加載器中。
現在,讓我們在Java EE企業環境的上下文中可視化整個過程,以便您更好地理解。
如您所見,子類加載器(Web應用程序)加載的任何代碼都將首先委托給父類加載器(Java EE App)。 然后,此類父類加載器將委派給JVM系統類路徑類加載器。 如果未從任何父類加載器中找到此類,則子類加載器將加載該類(假設已找到該類)。
請注意,Java EE容器(例如Oracle Weblogic)具有重寫此默認類加載器委托行為的機制。 我將在以后的文章中再次討論。
請隨時發表您對到目前為止所學知識的任何評論或問題。 第2部分很快就會發布。
參考: java.lang.NoClassDefFoundError:如何解決–第1部分來自我們的JCG合作伙伴 Pierre-Hugues Charbonneau,位于Java EE支持模式和Java教程博客。
翻譯自: https://www.javacodegeeks.com/2012/06/javalangnoclassdeffounderror-how-to.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java.lang.NoClassDefFoundError:如何解决–第1部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奉化属于哪个市(浙江省宁波奉化区)
- 下一篇: 避免Java中的空指针异常