關於tomcat WEB-INF/lib下類加載順序問題
-
問題描述
smc應用最近碰到一個線上問題,預發機器規則測試接口沒問題,但是線上機器就是調用有問題,表面上看,maven模塊引用的是自己想要的jar,但是debug的時候發現接口走的不是我引入的jar包類,然后全局搜索項目發現引用了不同的jar包里有相同的類,編譯的時候沒有問題
羊駝內部修改過的jar:
<dependency> <groupId>com.yangt.util</groupId> <artifactId>yangt-express</artifactId> <version>1.0.2</version> </dependency>
淘寶的jar:
<dependency> <groupId>com.taobao.util</groupId> <artifactId>taobao-express</artifactId> <version>3.0.6</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency>
-
問題搜索
網上搜索看到tomcat5-7對於WEB-INF/lib下的jar的搜索會按字母排序,tomcat8以上不會排序,依賴文件系統隨機返回文件列表,這樣的話tomcat8在不同的機器上可能出現運行時加載類混亂的問題(存在不同jar有相同類),從而發生詭異的問題。現在我們預發和線上都是tomcat8.x.x版本,所以類加載存在不確定性。所以原來smc存在以上2個jar包,運行到我的接口的時候預發優先加載了正確的類沒問題,但是到了線上優先加載了另外的類,從而導致返回了錯誤的結果。
-
解決方式
手動解決到底使用哪個包下的類,理論上不應該存在不同類型jar下相同的類名(相同jar不同版本可以用maven依賴排除),smc使用了
<dependency> <groupId>com.yangt.util</groupId> <artifactId>yangt-express</artifactId> <version>1.0.2</version> </dependency>