关于tomcat WEB-INF/lib下类加载顺序
关于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>