No such Method 或者 No such Class 解決並分析

問題

開發一個小功能,遇到了No such method ,由於沒有源碼,一直覺得攔截器的問題致使404,單步調試過程當中發現只要運行StringUtils.substringsBetween 這段代碼就會有問題。
好奇心趨勢一直調試這個問題,懷疑是否是像上次同樣JDK版本的問題致使的?java

查找過程

後來確認同事也是用的JDK1.8版本,並且這個方法也不是原生的,諮詢同事原來是由於包衝突的問題致使。框架

修復問題

StringUtils 是commons-lang下面的一個包,而用這個包的地方不少,很容易出現版本衝突的問題。這時候就要想辦法解決包衝突,問題解決。spa

爲何線上沒有問題,線下調試會出現問題?

這是一個值得深層次思考的問題,調試

classloader加載類有幾種方式:

  1. 使用Bootstrap Classloader來加載jdk或者jre的類。負責加載java基礎類,主要是 %JRE_HOME/lib/ 目錄下的rt.jar、resources.jar、charsets.jar和class等
  2. 使用Extension Classloader來加載,你能夠把須要加載的jar都扔到%JRE_HOME%/lib/ext下面,這個目錄下的jar包會在Bootstrap Classloader工做完後由Extension Classloader來加載。很是方便,很是省心。:)
  3. App ClassLoader 負責加載當前java應用的classpath中的全部類。
  4. 關於自定義ClassLoader

而咱們公司採用的SOA框架是自定義ClassLoader,引入jar包按照字母順序來加載,因此會出現某個jar 依賴的低版本的jar包先行加載到classLoader中,致使出現No such method 或者 No such Classssl

相關文章
相關標籤/搜索