2010-06-27 11 views
8

Acabo de comenzar a usar la guayaba en lugar de Google-Collections. La clase de Splitter parecía genial. Pero cuando lo uso, así:El divisor explota en el patrón simple

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

consigo un volcado de pila:

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) 

Los javadocs tienen nada acerca de este "com.google.common.base.Platform." así que es un poco difícil adivinar qué está pasando mal.

Como puede ver, el patrón es muy simple.

Respuesta

8

¿Qué versión de Guava estás usando? Esto funciona perfectamente bien para mí con r05.

Editar: Parece que el problema específico aquí es que tiene ambas google-collections y guava en su classpath de tiempo de ejecución. Platform (una clase interna) existía en google-collections pero no tenía el método precomputedCharMatcher. Splitter se está cargando correctamente desde el contenedor de guayaba, pero Platform se está cargando desde el contenedor google-collect.

+0

lo siento, debería haber dicho: guayaba-R05-SNAPSHOT.jar Sun JDK 1.6 en Ubuntu 10.04 Así que estoy usando R05 también, pero no su trabajo en absoluto. – fishtoprecords

+0

Hay una instantánea no r05 en la página de descargas de Guava y también está disponible en Maven ... inténtalo. – ColinD

+2

Nunca he oído hablar de "guava-r05-SNAPSHOT". –

13

El java.lang.NoSuchMethodError te dice que el método deseada no está en la ruta de clase actual tiempo de ejecución mientras estaba allí en el momento de compilación ruta de clase.

En otras palabras, para solucionar este problema, debe alinear su classpath en tiempo de ejecución para tener la versión correcta de la API como la que utilizó durante el tiempo de compilación. También puede deberse a tener diferentes versiones de la biblioteca mezcladas a lo largo del classpath en tiempo de ejecución. Limpiar el classpath entonces.

+5

Por supuesto, la detección de este problema es un poco complicada por el hecho de que las primeras versiones de guava - *. Jar se llamaban google-collect - *. Jar! –

3

En realidad. tienes dos versiones de la clase com.google.common.base.Platform y una de estas clases tiene o no tiene el método.

Intente eliminar uno de los archivos jar. Sugiero eliminar google-collections.jar y dejar gauva.jar.

Funcionará bien.

Cuestiones relacionadas