2011-11-24 10 views
26

Questa è una domanda che è stata posta prima, ma sfortunatamente nessuna soluzione sembra funzionare per me. Sto affrontando questa eccezione (con ridotta stack trace):SLF4J NoSuchMethodError su 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) 

Questo accade quando si compila tramite riga di comando Maven e anche durante la distribuzione di Tomcat. Funziona bene all'interno di IntelliJ IDEA.

In genere, mi aspetto che questo sia causato da più versioni della libreria SLF4J in uso. Ma la dipendenza albero Maven mostra tutte le librerie SLF4J in un'unica versione:

..$ 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 

ho anche assicurato che non c'è nessun altro JAR in ~/.m2/repository

Non ci sono riferimenti a librerie commons-logging o (li ho esclusi come confermato dal albero delle dipendenze

come posso risolvere questo problema che sto a corto di idee

EDIT:.?., come richiesto qui le dipendenze completi, prima del POM genitore:

<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> 

E poi il modulo che non riesce:

<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> 

Queste sono le proprietà impostate sul genitore:

<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> 

Dato i miei recenti esperimenti non sembra essere un problema relativo ai file di progetto, però. Ho provato a 'hg bisecare' il problema, ma tornando indietro settimane non riuscivo a trovare una versione che funzioni. Alcuni di questi sono in esecuzione nei sistemi di produzione, quindi non è probabile che sia un cambiamento di codice che causa questo problema.

+0

Puoi condividere le dipendenze da voi pom.xml? – icirellik

risposta

22

I javadocs per NoSuchMethodError dire,

Normalmente, questo errore viene catturato dal compilatore; questo errore può verificarsi solo in fase di esecuzione se la definizione di una classe è stata modificata in modo incompatibile.

Quindi questo è probabilmente causato da versioni incompatibili di slf4j in fase di caricamento. Piuttosto che guardare il classpath e indovinare dove sono state caricate le classi, trovare dove viene caricata la classe come descritto here.

Stampa da dove vengono caricati org.slf4j.spi.LocationAwareLogger, org.apache.commons.logging.impl.SLF4JLocationAwareLog e org.slf4j.Marker.

+15

Avrei dovuto pensare a chiedere al caricatore di classe. Si scopre che https://www.auskey.abr.gov.au è stato il colpevole: hanno scaricato una copia di 1.5.8 slf4j in/usr/java/packages/lib/ext/quando ho installato la chiave 5 giorni fa . Ci sono altre cose spaventose (log4j, bcmail, jaxb ...) - Avrò bisogno di creare un JRE separato. Vorrei che slf4j smettesse di rompere la compatibilità binaria, però. –

+1

Basta colpire esattamente questo problema dopo aver installato auskey! Grazie per il commento, @PeterBecker. –

1

Una soluzione.

Verificare sulla directory eclipse: configurazione \ org.eclipse.equinox.simpleconfigurator \ bundles.info

slf4j non più una

0

avevo scheduler quarzo nel mio file pom, che comprendeva slf4j, così ho escluso it:

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

e ha funzionato!

1

fare

MVN dipendenza pulita: -DskipTests albero;

rimuovere tutte le dipendenze di "org.slf4j" tranne uno (più alto ") come

<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

Stavamo affrontando il problema simile e si è scoperto che abbiamo avuto 2 versioni incompatibili di vasi SLF4J nel classpath . il percorso della classe aveva i seguenti 2 versioni incompatibili. Dopo aver rimosso le versioni inferiori del percorso di classe, il problema è stato risolto.

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

risolto !!!

Avevo dipendenza da un altro progetto che utilizzava il plug-in JavaDoc. Il plugin JavaDoc utilizza internamente Maven-core e Maven-core-2.2.1 utilizza jcl-over-slf4j: 1.5.6. Maven-core è un jar di livello superiore.

Ora, a causa di questo jar JCL, ho riscontrato questo problema. Quindi l'ho rimosso dalla cartella lib di weblogic (o da qualunque server si stia utilizzando).

E ALAS !! Il problema è stato risolto.

Nota 1: - È inoltre possibile utilizzare il tag <exclusion> di Maven per rimuovere questa dipendenza dallo JavaDoc (o da qualsiasi altro plug-in) per risolvere questo problema.

Nota 2: - Utilizzare la scheda Dependency Hierarchy in POM per verificare se sono presenti alcuni vecchi vasi SLF4J. E rimuovi il resto e mantieni solo una versione.

Speranza che aiuta ..

0

Questo di solito succede quando si ha dipendenze che utilizzano entrambi la stessa dipendenza transitiva. Ciò significa che 2 delle tue dipendenze (o dell'app e una dipendenza transitiva) utilizzano entrambi SLF4J internamente con versioni diverse. Ma la tua app può utilizzare una sola versione della classe allo stesso tempo, quindi deve scegliere (non conoscere le regole qui ... casuali?)

Per risolvere il problema, di solito è necessario eseguire una mvn dependency:tree per vedere quali utilizzano versioni differenti di SLF4J.

Aggiungendo questa dipendenza risolto il problema per me

<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> 
Problemi correlati