本文為博主原創,轉載請註明出處:
最近在進行服務的環境升級,將 服務的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>