tomcat7 與 tomcat8 載入 jar包的順序

香吧香發表於2023-02-20

本文為博主原創,轉載請註明出處:

  最近在進行服務的環境升級,將 服務的tomcat7升級到 tomcat8;當把 tomcat 升級到 tomcat8 的時候,進行服務啟動異常,報 jar 包衝突的 異常,但是嘗試幾次之後,偶爾也有成功的機率,便推測 是 jar 包載入的順序不對,因為 當相同路徑的類或資源在載入之後,便不會進行再載入,由於專案中有兩個相同的全限定名的類,在服務啟動的時候,載入錯誤的類的時候,便報jar包衝突。

  於是便設定 classpath,但發現設定 classpath 也沒有生效,透過檢視資料以及閱讀 tomcat 的原始碼,發現 tomcat7 與 tomcat8 的類載入邏輯是不一樣的,tomcat 7  在載入jar包 路徑下的資源後,會對 所有的 jar包根據 字母順序進行排序,字母在前面的 jar 包會優先載入,

tomcat7載入 jar包順序

  主要程式碼如下:

  list是獲得了應用中WEB-INF下lib下所有jar包的路徑。我們跟蹤進去發現`FileDirContext` 的list方法中有下面這一句:

 

tomcat8載入

  主要的程式碼:

  

  進一步繼續,直接file.list獲取過濾jar,並沒有排序

  

tomcat8 設定優先載入順序

  

 

   code如下:

<Resources>
     <PreResources base="d://webapps/ROOT/WEB-INF/lib/sms.reyo.cn.jar"
                   className="org.apache.catalina.webresources.JarResourceSet"
                   webAppMount="/WEB-INF/classes"/>
 </Resources>

 

  

 

相關文章