2010-06-27 26 views
8

我剛剛開始給我們Guava代替谷歌收藏。 Splitter類似乎很酷。但是,當我使用它,像這樣:分離器爆炸對簡單的模式

private static final Pattern p = Pattern.compile(" +"); 
private static final Splitter usSplitter = Splitter.on(p).trimResults(); 

我得到一個堆棧轉儲:

java.lang.NoSuchMethodError: com.google.common.base.Platform.precomputeCharMatcher(Lcom/google/common/base/CharMatcher;)Lcom/google/common/base/CharMatcher; 
     at com.google.common.base.CharMatcher.precomputed(CharMatcher.java:662) 
     at com.google.common.base.CharMatcher.<clinit>(CharMatcher.java:69) 
     at com.google.common.base.Splitter.<init>(Splitter.java:99) 
     at com.google.common.base.Splitter.on(Splitter.java:208) 

的javadoc,有沒有談到這個 「com.google.common.base.Platform。」所以有點難以猜測出了什麼問題。

正如你所看到的,模式是簡單的。

回答

8

您使用的是什麼版本的番石榴?這對r05來說非常適合我。

編輯:看起來像這裏的具體問題是,你的運行時類路徑中既有谷歌集合又有番石榴。 Platform(內部類)存在於google收藏夾中,但沒有precomputedCharMatcher方法。 Splitter正在從番石榴罐中正確加載,但Platform正在從谷歌收集罐加載。

+0

對不起,應該說: 番石榴-R05-SNAPSHOT.jar 太陽JDK 1.6在Ubuntu 10.04 所以我使用的R05過,但它不工作。 – fishtoprecords 2010-06-27 04:05:35

+0

在Guava下載頁面上有一個非快照r05,也可以在Maven中使用...嘗試一下。 – ColinD 2010-06-27 04:12:26

+2

我從來沒有聽說過「番石榴-r05-SNAPSHOT」。 – 2010-06-27 16:05:10

13

java.lang.NoSuchMethodError告訴你所需的方法在當前運行時類路徑缺失,而這是那裏的編譯時classpath中

換句話說,要解決此問題,您需要對齊運行時類路徑以使其具有正確的API版本,與編譯期間使用的版本相同。它也可能是由於在整個運行時類路徑中混合了不同版本的庫引起的。然後清理類路徑。

+5

當然,這個問題的檢測有點複雜,因爲最早的番石榴 - *。jar版本被稱爲google-collect - *。jar! – 2010-06-27 18:37:15

3

其實。你有兩個版本的com.google.common.base.Platform類,其中一個類有或沒有方法。

嘗試刪除其中一個jar文件。我建議刪除google-collections.jar並離開gauva.jar

它會正常工作。