2010-06-27 8 views
8

Ich beginne gerade an uns Guava anstelle von Google-Sammlungen. Die Splitter-Klasse schien cool. Aber wenn ich es verwenden, wie folgt aus:Splitter explodiert auf einfache Muster

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

ich einen Stack-Dump: "com.google.common.base.Platform"

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) 

Die javadocs haben nichts über diese Es ist also ein bisschen schwer zu erraten, was schief läuft.

Wie Sie sehen können, ist das Muster tot einfach.

Antwort

8

Welche Version von Guava verwenden Sie? Das klappt bei mir mit R05 ganz gut.

Bearbeiten: Es scheint, dass das spezifische Problem hier ist, dass Sie sowohl google-Sammlungen als auch Guave in Ihrem Laufzeitklassenpfad haben. Platform (eine interne Klasse) existierte in Google-Sammlungen, hatte aber nicht die precomputedCharMatcher Methode. Splitter wird ordnungsgemäß aus dem Guavenglas geladen, aber Platform wird aus dem Google-Collect-Jar geladen.

+0

sorry, sollte gesagt haben: Guave-r05-SNAPSHOT.jar Sun JDK 1.6 auf Ubuntu 10.04 So auch ich bin mit R05, aber seine nicht funktioniert. – fishtoprecords

+0

Auf der Guava-Download-Seite gibt es einen Nicht-Snapshot r05, der auch in Maven verfügbar ist ... versuchen Sie es. – ColinD

+2

Ich habe noch nie von einem "Guava-R05-SNAPSHOT" gehört. –

13

Die java.lang.NoSuchMethodError sagt Ihnen, dass Sie die gewünschte Methode in der aktuellen Laufzeit Classpath fehlt während es dort in der Classpath Kompilierung war.

Mit anderen Worten, um dieses Problem zu beheben, müssen Sie Ihren Laufzeitklassenpfad so ausrichten, dass er die korrekte Version der API aufweist, die Sie während der Kompilierungszeit verwendet haben. Es kann auch dadurch verursacht werden, dass verschiedene Versionen der Bibliothek während des gesamten Laufzeitklassenpfads gemischt sind. Bereinigen Sie den Klassenpfad dann.

+5

Natürlich ist die Entdeckung dieses Problems durch die Tatsache, dass die frühesten Versionen von Guava - * .jar google-collect - *. –

3

Eigentlich. Sie haben zwei Version com.google.common.base.Platform Klasse und eine dieser Klassen hat oder hat nicht die Methode.

Versuchen Sie, eine der JAR-Dateien zu entfernen. Ich schlage vor, google-collections.jar zu entfernen und gauva.jar zu verlassen.

Es wird gut funktionieren.