【踩坑小記】java運行後NoClassDefFoundError:Initializer fail

本次是對一次踩坑的記錄,事情起因,一臺服務器在部署完代碼後重啓後突然部分接口出現了500錯誤,NoClassDefFoundError:com.xx.xxx,對於這種報錯,是因爲在編譯的時候Java虛擬機找到了這個類,但是在運行的時候未找到這個類,注意跟NoClassFoundError區分開。

當遇到這個問題時,我首先查看了應用日誌,發現流程執行過程中到了某個地方就中斷了,沒有發現詳細的報錯日誌。於是找到WebSphere的系統日誌,發現了裏面的詳細日誌,根據cause by提示在將變量值轉爲int時因爲輸入的字符串“SD”導致報錯,去找到對應的源碼,發現在調用A方法時報錯了,在看系統日誌SystemOut.log裏面的其他內容,不同的接口都出現了類似的報錯,看打印的詳細報錯信息,都是因爲調用了同一個方法A。

於是我研究了下方法A,輸入三個參數,分別是一串數字id,源數據orig和簽名數據sign,方法A是一個驗籤的方法,再往裏繼續深入查看這個方法,引用了jar包裏的內容,就沒仔細看下去了,這時腦子突然閃過是不是因爲祕鑰問題導致的念頭,但是因爲發現這個方法並沒找到什麼錯誤而錯過。因爲在報錯中提示的是將字符串轉爲Int型時報錯了,就考慮說是第一個參數id是不是傳入的有問題,因爲orig和sign不應該做這種轉換,看通過斷點及看打印的日誌,沒發現輸入的id參數有什麼異常。

於是上網尋求幫助,查看WAS出現這種報錯時的原因,看了很多博文後總結了共會有以下幾種情況:

  1. WebSphere在重啓後出現了內存溢出的情況導致,對於這種情況需要殺掉進程重新啓用節點和服務。
  2. 因爲報錯的類存在問題導致,需排查類的情況
  3. JDK版本的問題導致,需查看是否有更新過JDK
  4. 可能是由於缺少某個jar包導致

對上面提到的幾種情況一一進行了嘗試,發現仍然沒找到原因,這是有人跟我說昨天找人升級了JDK,於是在想是不是因爲JDK的問題導致,不過另一個環境還是正常的,但是解決無果的情況,於是嘗試恢復JDK的版本,折騰了一通後發現跟這個沒有任何關係。

查來查去沒找到原因,懷疑還是跟WAS有關係,於是就將WebSphere上部署的應用及服務全部刪除重新安裝了一遍,測試了一下發現竟然可以了,很開心覺得問題解決了。但是,過了一會兒查訂單發現使用的是另一套環境的數據庫,於是將數據庫連接改回來後重啓後又不行了,讓人從天堂又調回了地獄。我突然靈光一現,這肯定是跟數據庫的數據有關係,然後想到是祕鑰初始化加載到內存裏時出現了問題,隨後想到之前讓測試驗證執行的腳本時在數據庫里加入了錯誤的祕鑰數據,趕緊去查看數據庫的數據,果然在祕鑰的字段裏發現了報錯的兩個字符,然後馬上刪除重啓服務,功能恢復正常。

通過這次問題的處理,有以下幾點心得:

  1. 即使是測試,也不能隨便使用一些錯誤的垃圾數據,不然會給自己挖坑。
  2. 根據打印的報錯信息排查問題時,如果發現提示報錯的方法無問題時,需要在深入排查關聯的方法或者依賴的方法是否存在問題。
  3. 當你在解決問題時突然閃過一點對某個功能產生懷疑時,最好去排查下,說不定能發現找到問題的關鍵點。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章