关于Java classpath中不同jar包包含同名类的选择

在项目中使用了Guava Cache来缓存一些配置 启动后访问接口报错

Caused by: java.lang.NoSuchMethodError: com.google.common.base.Platform.systemNanoTime()J
    at com.google.common.base.Ticker$1.read(Ticker.java:64)
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2225)
    

经查原来是存在两个Platform 一个位于Guava中, 一个位于google-collections

图片描述

之所以会发生上面的错误 因为Guava中的代码引用了google-collections中的Platform导致? 既然存在两个Platform 为什么每次访问接口使用的都是google-collections中的Platform呢? 为什么不优先选择本jar包中的Platform呢? 或者随机选择一个呢?

阅读 9.7k
1 个回答
新手上路,请多包涵

jvm查找类,不仅仅是按名字找,还有包,如果包不同,也视为为同的class,如果package+class都相同,则根据classpath的设置顺序,前面的优先加载,一旦前面的被加载,后面的就再也不会被加载了,也就是说其实还是有一定的加载规则加载顺序的,你不能寄希望与系统,让它智能的加载你想要的。
如果系统出现了重名class,危险性是非常高的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题