上篇文章中,小黑哥分析 Maven 依赖冲突分为两类:
- 项目同一依赖应用,存在多版本,每个版本同一个类,可能存在差异。
- 项目不同依赖应用,存在包名,类名完全一样的类。
第二种情况,往往是这个场景,本地/测试环境运行的都是好好的,上线之后测试就是不行。
这其实与 JVM 类加载有关,本地/测试环境加载正确类,而生产环节加载错的类,为什么会这样?
主要有两个原因:
- 同一个类只会被加载器加载一次
- 不同环境,类的加载顺序不同
同一个类只会被加载器加载一次
JVM 类加载具有缓存机制,每个类加载的时候首先检查一遍,类是否被当前类加载器加载。若未被加载,先交给其父类加载器加载,父类加载器不能加载,才会交给当前类加载器。
当前类加载器加载完成之后,将会将其缓存起来。