2011-11-24 17 views
26

Esta es una pregunta que se ha hecho antes, pero lamentablemente ninguna solución parece funcionar para mí. Estoy frente a esta excepción (con seguimiento de la pila abreviada):SLF4J NoSuchMethodError en LocationAwareLogger

java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V 
    at org.apache.commons.logging.impl.SLF4JLocationAwareLog.debug(SLF4JLocationAwareLog.java:133) 
    at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:221) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:401) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) 

Esto sucede cuando se compila utilizando una línea de comandos Maven y también cuando el despliegue de Tomcat. Funciona bien dentro de IntelliJ IDEA.

Normalmente, esperaría que esto se deba a que varias versiones de la biblioteca SLF4J están en uso. Pero el árbol de dependencias Maven muestra todas las bibliotecas SLF4J en una única versión:

..$ mvn dependency:tree | grep slf4j 
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.4:compile 
[INFO] | \- org.slf4j:slf4j-api:jar:1.6.4:compile 
[INFO] +- org.slf4j:slf4j-api:jar:1.6.4:compile 
[INFO] +- org.slf4j:jcl-over-slf4j:jar:1.6.4:compile 
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.4:compile 

incluso me aseguré de que no hay otra JAR en ~/.m2/repositorio

No hay referencias a bibliotecas commons-logging o bien (me gustan todos excluido como lo confirma el árbol de dependencias

¿Cómo puedo resolver este problema me está acabando de ideas

EDIT:.?. conforme a lo solicitado aquí las dependencias completos, en primer lugar el POM padres:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>${org.hibernate.validator.version}</version> 
      <exclusions> 
       <!-- Exclude SLF4j to avoid version conflicts (we have 1.6.2, this drags in 1.6.1) --> 
       <exclusion> 
        <groupId>org.slf4j</groupId> 
        <artifactId>slf4j-api</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator-annotation-processor</artifactId> 
      <version>${org.hibernate.validator.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.0.0.GA</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${org.springframework.version}</version> 
      <exclusions> 
       <!-- Exclude Commons Logging in favor of SLF4j --> 
       <exclusion> 
        <groupId>commons-logging</groupId> 
        <artifactId>commons-logging</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-config</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-core</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-web</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-taglibs</artifactId> 
      <version>${org.springframework.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.inject</groupId> 
      <artifactId>javax.inject</artifactId> 
      <version>1</version> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.8.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>${org.slf4j.backend}</artifactId> 
      <version>${org.slf4j.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hsqldb</groupId> 
      <artifactId>hsqldb</artifactId> 
      <version>2.2.4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
      <version>4.1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time</artifactId> 
      <version>2.0</version> 
     </dependency> 
     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time-jsptags</artifactId> 
      <version>1.0.2</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>2.5</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet.jsp</groupId> 
      <artifactId>jsp-api</artifactId> 
      <version>2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>9.0-801.jdbc4</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-lang3</artifactId> 
      <version>3.0.1</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

Y entonces el módulo que falla:

<dependencies> 
    // client specific dependencies skipped // 

    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>10.0.1</version> 
    </dependency> 

    <!-- Spring --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <exclusions> 
      <!-- Exclude Commons Logging in favor of SLF4j --> 
      <exclusion> 
       <groupId>commons-logging</groupId> 
       <artifactId>commons-logging</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-config</artifactId> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-core</artifactId> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-web</artifactId> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security</groupId> 
     <artifactId>spring-security-taglibs</artifactId> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.inject</groupId> 
     <artifactId>javax.inject</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>cglib</groupId> 
     <artifactId>cglib</artifactId> 
     <version>2.2.2</version> 
    </dependency> 

    <!-- Logging --> 
    <dependency> 
     <groupId>net.sf.opencsv</groupId> 
     <artifactId>opencsv</artifactId> 
     <version>2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${org.slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jcl-over-slf4j</artifactId> 
     <version>${org.slf4j.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>${org.slf4j.backend}</artifactId> 
     <version>${org.slf4j.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.16</version> 
    </dependency> 

    <!-- Joda Time --> 
    <dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time-jsptags</artifactId> 
     <scope>runtime</scope> 
    </dependency> 

    <!-- Servlet --> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet.jsp</groupId> 
     <artifactId>jsp-api</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.google.visualization</groupId> 
     <artifactId>visualization-datasource</artifactId> 
     <version>1.0.2</version> 
    </dependency> 

    <dependency> 
     <groupId>org.mybatis</groupId> 
     <artifactId>mybatis-spring</artifactId> 
     <version>1.0.2</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.0</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-io</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>2.1</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-fileupload</groupId> 
     <artifactId>commons-fileupload</artifactId> 
     <version>1.2.2</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi</artifactId> 
     <version>3.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi-ooxml</artifactId> 
     <version>3.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi-ooxml-schemas</artifactId> 
     <version>3.7</version> 
    </dependency> 

    <dependency> 
     <groupId>postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <scope>runtime</scope> 
    </dependency> 

    <dependency> 
     <scope>test</scope> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
    </dependency> 
</dependencies> 

Estas son las propiedades establecidas en la matriz:

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <org.hibernate.validator.version>4.2.0.Final</org.hibernate.validator.version> 
    <org.slf4j.backend>slf4j-simple</org.slf4j.backend> 
    <org.slf4j.version>1.6.4</org.slf4j.version> 
    <org.springframework.version>3.0.5.RELEASE</org.springframework.version> 
</properties> 

Dadas mis últimos experimentos no parece ser un problema relacionado a los archivos del proyecto, sin embargo. Traté de 'hg bisectar' el problema, pero retrocediendo semanas no pude encontrar una versión que funcione. Algunos de estos se ejecutan en sistemas de producción, por lo que no es probable que sea un cambio de código el que causa este problema.

+0

¿Puede compartir las dependencias de usted pom.xml? – icirellik

Respuesta

22

Los javadocs para NoSuchMethodError dicen,

Normalmente, este error es capturado por el compilador; este error puede ocurrir solo en tiempo de ejecución si la definición de una clase ha cambiado de manera incompatible.

Probablemente esto se deba a la carga de versiones incompatibles de slf4j. En lugar de mirar su ruta de clase y adivinar dónde se cargan las clases, busque dónde se carga su clase como se describe en here.

Imprimir donde org.slf4j.spi.LocationAwareLogger, org.apache.commons.logging.impl.SLF4JLocationAwareLog y org.slf4j.Marker se están cargando desde.

+15

Debería haber pensado en preguntar al cargador de clases. Resulta que https://www.auskey.abr.gov.au fue el culpable: volcaron una copia de 1.5.8 slf4j en/usr/java/packages/lib/ext/cuando instalé su clave hace 5 días . Hay más cosas de miedo allí (log4j, bcmail, jaxb ...) - Tendré que configurar un JRE por separado. Aunque me gustaría que slf4j dejara de romper la compatibilidad binaria. –

+1

¡Simplemente pulse exactamente este problema después de instalar auskey! Gracias por el comentario, @PeterBecker. –

1

Una solución.

Compruebe el directorio de Eclipse: configuración \ org.eclipse.equinox.simpleconfigurator \ bundles.info

slf4j no más de un

0

tuve programador de cuarzo en mi archivo POM, que incluía slf4j, por lo Excluí it:

<exclusion> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
</exclusion> 

y trabajado!

1

hacer

MVN dependencia limpia: -DskipTests de árboles;

eliminar todas las dependencias de "org.slf4j" excepto uno (uno más alto ") como

<dependency> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.6</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.slf4j</groupId> 
       <artifactId>slf4j-jdk14</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.slf4j</groupId> 
       <artifactId>jcl-over-slf4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
1

Estábamos frente al problema similar y resultó que tenía 2 versiones incompatibles de frascos SLF4J en la ruta de clase . la ruta de clase tenía las siguientes 2 versiones incompatibles. Después de quitar las versiones más bajas de la ruta de clase, el problema se fija.

slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar

slf4j-api-1.5.11.jar
slf4j-log4j12-1.5.11.jar

0

Resuelto !!!

Estaba teniendo dependencia de otro proyecto que estaba usando el complemento JavaDoc. JavaDoc plugin utiliza internamente Maven-core y Maven-core-2.2.1 utiliza jcl-over-slf4j: 1.5.6. Maven-core es un jar de nivel primario.

Ahora, debido a este jar JCL, me enfrentaba a este problema. Por lo tanto, lo eliminé de la carpeta lib de weblogic (o del servidor que pueda estar usando).

Y ALAS !! El problema fue resuelto

Nota 1: - También puede usar la etiqueta <exclusion> de Maven para eliminar esta dependencia del JavaDoc (o de cualquier otro complemento) para resolver este problema.

Nota 2: - Use la pestaña Dependency Hierarchy en POM para ver si hay alguna jarra SLF4J tan vieja. Y elimine el resto y conserve solo una versión.

creo que sirve ..

0

Esto suele suceder cuando se tiene dependencias que ambos utilizan la misma dependencia transitiva. Esto significa que 2 de sus dependencias (o su aplicación, y una dependencia transitiva) usan SLF4J internamente con versiones diferentes. Pero su aplicación solo puede usar una versión única de la clase al mismo tiempo, así que tiene que elegir (¿no conoce las reglas aquí ... al azar?)

Para resolver el problema, por lo general necesita hacer una mvn dependency:tree para ver cuáles están usando diferentes versiones de SLF4J.

La adición de esta dependencia resolvió el problema para mí

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.25</version> 
</dependency> 

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.7.5</version> 
</dependency>