問題雜談:關於java.lang.NoClassDefFoundError和ClassNotFoundException的幾種解決方法

一、引

開發中總會碰到一些問題,讓人錘頭頓足,即時花半天時間都還是沒有解決。而接下來準備講的java.lang.NoClassDefFoundError和ClassNotFoundException,就是屬於讓人咬牙切齒的問題之二。這兩個問題乍一看好像都是指找不到某個類了,雖然出現這兩種問題的部分原因相同,但事實上,這兩個錯誤是完全不同的。我們往往花費時間去不斷嘗試一些其他的方法去解決這個問題,而沒有真正去理解這個錯誤的原因。出現這兩個問題的原因很多,但是往往我們大多數人遇到的都是其中的一兩種,所以,爲了儘量幫助有需要的人,我根據以往的開發經驗,總結一下解決這兩種報錯的幾種方法,並簡單的闡述一下他們之間的差別。

二、解決方法

我們先從解決方法開始講起,畢竟大多數人更關心的是如何解決問題。如果是要調編譯器,我會從列舉Idea Intellij和eclipse兩種操作截圖。ps:本人常用的是idea哦,當然,eclipse也會用,只不過相對而言,更少而已。以下的解決方法沒有特別說明的,就是相同的解決方法。

解決方法一:檢測是否成功的將相應的jar包或者依賴導入。

idea中:

eclipse中:右擊項目,選擇Build Path->Configure Build Path,進入項目配置

解決方法二:項目已經導入了包,但還是報錯,那就檢查WEN-INF目錄下的libs是否有導入的包。

idea中:

eclipse中:

解決方法三:將包粘貼進了WEB-INF的lib下,但還是沒用,那麼這個時候你就要檢查是否添加進library。

idea中:

eclipse中:

解決方法四:CLASSPATH環境變量配置出錯。

在系統環境變量那一欄中點->新建classpath。變量名:classpath變值: .;%JAVA_HOME%/lib/;%JAVA_HOME%/jre/lib/(注意,CLASSPATH最前面是有個“.”的,表示當前目錄,這樣當我們運行javaAClass的時候,系統就會先在當前目錄尋找AClass文件了。)

解決方法五:NoClassDefFoundError也可能由於類的靜態初始化模塊錯誤導致。

當你的類執行一些靜態初始化模塊操作,如果初始化模塊拋出異常,哪些依賴這個類的其他類會拋出NoClassDefFoundError的錯誤。如果你查看程序日誌,會發現一些java.lang.ExceptionInInitializerError的錯誤日誌,ExceptionInInitializerError的錯誤會導致java.lang.NoClassDefFoundError: Could not initialize class。

解決方法六:你可能用jar命令運行你的程序,但類並沒有在jar文件的manifest文件中的classpath屬性中定義。

idea中:

解決方法七:Jar文件的權限問題也可能導致NoClassDefFoundError。

如果你的程序運行在像linux這樣多用戶的操作系統種,你需要把你應用相關的資源文件,如Jar文件,類庫文件,配置文件的權限單獨分配給程序所屬用戶組,如果你使用了多個用戶不同程序共享的jar包時,很容易出現權限問題。比如其他用戶應用所屬權限的jar包你的程序沒有權限訪問,會導致java.lang.NoClassDefFoundError的錯誤。

三、總結

我們經常被java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError這兩個錯誤迷惑不清,儘管他們都與Java classpath有關,但是他們完全不同。NoClassDefFoundError發生在JVM在動態運行時,根據你提供的類名,在classpath中找到對應的類進行加載,但當它找不到這個類時,就發生了java.lang.NoClassDefFoundError的錯誤,而ClassNotFoundException是在編譯的時候在classpath中找不到對應的類而發生的錯誤。ClassNotFoundException比NoClassDefFoundError容易解決,是因爲在編譯時我們就知道錯誤發生,並且完全是由於環境的問題導致。而如果你在J2EE的環境下工作,並且得到NoClassDefFoundError的異常,而且對應的錯誤的類是確實存在的,這說明這個類對於類加載器來說,可能是不可見的。說白了,java.lang.ClassNotFoundException看不見用不了,java.lang.ClassNotFoundException看得見用不了。

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