2016-09-19 85 views
1

在我目前的項目中,我Guava Cache緩存與過期的東西,但在實際調用該接口,它有如下錯誤關於在不同jar中存在兩個相同的名字類?

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) 

其原因是,有在classpath中有兩個Platform

enter image description here

一個在Gauva,一個在google-collections:jar

而且LocalCache Guava使用Paltformgoogle-collections導致此錯誤。我對此有一些疑問,爲什麼不在同一個罐子裏的Class具有更高的優先級?爲什麼不隨機選擇一個,但總是使用的google-collections

+0

檢查您的導入。您可能會輸入錯誤的版本。 – Gikkman

回答

0

您可以通過指定classpath順序強制優先級。 Java在jar中查找class以便在classpath中定義。

如果您使用maven和ide運行,您無法控制classpath的順序,但可以從classpath中排除dependee模塊。

<dependency> 
     <groupId>some</groupId> 
     <artifactId>id1</artifactId> 
     <version>1.0.0.0</version> 
     <exclusions> 
      <exclusion> 
       <groupId>another</groupId> 
       <artifactId>id2</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

在這種情況下,id2不會再在您的類路徑中。

1

有可能兩個罐子包括相同的類名稱。例如,當您導入相同庫的兩個不同版本的罐子時,就會發生這種情況。

如果使用maven導入依賴項,例如導入庫時,它可以導入導致此類問題的其他庫的依賴項。在這種情況下,您需要明確指出,當您導入庫時,您需要排除輔助依賴關係。這是通過exclusions標籤完成的。

0

類的加載優先級將取決於ClassLoader,你可以找到很多關於java類加載的文章。如果您嘗試運行獨立的Java應用程序,則可能會通過URLClassLoader完成類加載。

在這種情況下,在-cp或-classpath中給出的所有URL(jar文件位置或類)都將作爲URL添加到URLClassLoader,然後當應用程序需要加載類時,此URLClassLoader將遍歷其URL和一次它發現它將被加載的類。

所以一切都取決於類路徑順序。

注意:但在某些情況下,類加載並不簡單。例如:jboss模塊類加載器。

相關問題