在项目中使用了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
呢? 或者随机选择一个呢?
jvm查找类,不仅仅是按名字找,还有包,如果包不同,也视为为同的class,如果package+class都相同,则根据classpath的设置顺序,前面的优先加载,一旦前面的被加载,后面的就再也不会被加载了,也就是说其实还是有一定的加载规则加载顺序的,你不能寄希望与系统,让它智能的加载你想要的。
如果系统出现了重名class,危险性是非常高的。