关于tomcat WEB-INF/lib下类加载顺序

关于tomcat WEB-INF/lib下类加载顺序问题

  1. 问题描述

    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>
    
  2. 问题搜索

    网上搜索看到tomcat5-7对于WEB-INF/lib下的jar的搜索会按字母排序,tomcat8以上不会排序,依赖文件系统随机返回文件列表,这样的话tomcat8在不同的机器上可能出现运行时加载类混乱的问题(存在不同jar有相同类),从而发生诡异的问题。现在我们预发和线上都是tomcat8.x.x版本,所以类加载存在不确定性。所以原来smc存在以上2个jar包,运行到我的接口的时候预发优先加载了正确的类没问题,但是到了线上优先加载了另外的类,从而导致返回了错误的结果。

  3. 解决方式

    手动解决到底使用哪个包下的类,理论上不应该存在不同类型jar下相同的类名(相同jar不同版本可以用maven依赖排除),smc使用了

    <dependency>
     <groupId>com.yangt.util</groupId>
     <artifactId>yangt-express</artifactId>
     <version>1.0.2</version>
    </dependency>
    
posted @ 2018-10-25 20:51  四少啊  阅读(3089)  评论(0编辑  收藏  举报