關於java.lang.NoClassDefFoundError: javax/crypto/Cipher的問題


最近寫一個加密的時候遇見了一個很奇怪的問題,就是在我本地跑的時候是沒有錯誤的,但是上線測試環境的時候,報一個運行時異常:java.lang.NoClassDefFoundError: javax/crypto/Cipher  我查了jdk,再jre里面能找到這個jar包,所以就找不到什么原因了。

最后解決辦法:在你使用這個類的那個包下面的MF文件中手動引入無法加載的這個jar包。

至於引起這個問題的原因,我覺得應該是在測試環境有重名的jar包導致虛擬機無法識別加載出來,當然這只是我的猜測,歡迎大家指正。(擦掉了一下公司的包)

 

 NoClassDefFoundError錯誤發生的原因
NoClassDefFoundError錯誤的發生,是因為Java虛擬機在編譯時能找到合適的類,而在運行時不能找到合適的類導致的錯誤。例如在運行時我們想調用某個類的方法或者訪問這個類的靜態成員的時候,發現這個類不可用,此時Java虛擬機就會拋出NoClassDefFoundError錯誤。與ClassNotFoundException的不同在於,這個錯誤發生只在運行時需要加載對應的類不成功,而不是編譯時發生。很多Java開發者很容易在這里把這兩個錯誤搞混。

簡單總結就是,NoClassDefFoundError發生在編譯時對應的類可用,而運行時在Java的classpath路徑中,對應的類不可用導致的錯誤。

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

怎么解決NoClassDefFoundError錯誤
根據前文,很明顯NoClassDefFoundError的錯誤是因為在運行時類加載器在classpath下找不到需要加載的類,所以我們需要把對應的類加載到classpath中,或者檢查為什么類在classpath中是不可用的,這個發生可能的原因如下:

對應的Class在java的classpath中不可用
你可能用jar命令運行你的程序,但類並沒有在jar文件的manifest文件中的classpath屬性中定義
可能程序的啟動腳本覆蓋了原來的classpath環境變量
因為NoClassDefFoundError是java.lang.LinkageError的一個子類,所以可能由於程序依賴的原生的類庫不可用而導致
檢查日志文件中是否有java.lang.ExceptionInInitializerError這樣的錯誤,NoClassDefFoundError有可能是由於靜態初始化失敗導致的(這是我遇到的問題的解決辦法)
如果你工作在J2EE的環境,有多個不同的類加載器,也可能導致NoClassDefFoundError。
NoClassDefFoundError也可能由於類的靜態初始化模塊錯誤導致,當你的類執行一些靜態初始化模塊操作,如果初始化模塊拋出異常,哪些依賴這個類的其他類會拋出NoClassDefFoundError的錯誤。如果你查看程序日志,會發現一些java.lang.ExceptionInInitializerError的錯誤日志,ExceptionInInitializerError的錯誤會導致java.lang.NoClassDefFoundError: Could not initialize class   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM