2011-11-24 13 views
26

To jest pytanie, które zostało zadane wcześniej, ale niestety, żadne rozwiązanie nie działa dla mnie. Jestem stoi ten wyjątek (ze skróconej ślad stosu):SLF4J NoSuchMethodError na 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) 

Dzieje się tak podczas kompilacji przy użyciu wiersza polecenia Maven, a także podczas wdrażania do Tomcat. Działa dobrze w IntelliJ IDEA.

Zazwyczaj spodziewałbym się, że jest to spowodowane używaniem wielu wersji biblioteki SLF4J. Ale drzewo Maven zależność pokazuje wszystkie biblioteki slf4j w jednej wersji:

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

nawet zapewnił, że nie ma innego JAR w katalogu ~/.m2/repozytorium

Brak odniesienia do rejestrowania bibliotek Commons albo (I wykluczyć je wszystkie jako potwierdzone przez drzewa zależności

jak mogę rozwiązać ten problem biegnę z pomysłów

EDIT:.?. zgodnie z wnioskiem o pełne zależnościami, najpierw POM nadrzędny:

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

I wtedy moduł, który kończy się niepowodzeniem:

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

Są to właściwości ustawione na nadrzędny:

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

Given moje ostatnie eksperymenty nie wydaje się być kwestia odnosząca do plików projektu. Próbowałem "hg przeciąć" problem, ale wracając do tygodni nie mogłem znaleźć wersji, która działa. Niektóre z nich działają w systemach produkcyjnych, więc prawdopodobnie nie będzie to zmiana kodu, która powoduje ten problem.

+0

można udostępnić zależności od was pom.xml? – icirellik

Odpowiedz

22

W Javadocs dla NoSuchMethodError powiedzieć,

Zazwyczaj błąd ten zostanie złapany przez kompilator; ten błąd może wystąpić tylko w czasie wykonywania, jeśli definicja klasy zmieniła się niepoprawnie.

Jest to prawdopodobnie spowodowane niekompatybilnymi wersjami ładowanego slf4j. Zamiast spoglądać na ścieżkę klas i zgadywania, gdzie są ładowane klasy, znajdź miejsce, w którym twoja klasa jest załadowana zgodnie z opisem here.

Wydrukuj, skąd są pobierane org.slf4j.spi.LocationAwareLogger, i org.slf4j.Marker.

+15

Powinienem był pomyśleć o zadaniu programu ładującego klasy. Okazuje się, że to winowajca: https://www.auskey.abr.gov.au: połknęli kopię pliku slf4j 1.5.8 do/usr/java/packages/lib/ext/kiedy zainstalowałem ich klucz 5 dni temu . Jest tam więcej przerażających rzeczy (log4j, bcmail, jaxb ...) - muszę ustawić oddzielne środowisko JRE. Chciałbym, żeby slf4j przestał łamać kompatybilność binarną. –

+1

Po prostu włóż ten problem po zainstalowaniu auskey! Dzięki za komentarz, @PeterBecker. –

1

Jedno rozwiązanie.

Sprawdź na eclipse katalogu: Configuration \ org.eclipse.equinox.simpleconfigurator \ bundles.info

slf4j nie więcej jeden

0

miałem planującego kwarcowy w moim pliku POM, który obejmował slf4j, więc wykluczone to:

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

i zadziałało!

1

do

zależność mvn clean: tree -DskipTests;

usunąć wszystkie zależności z „org.slf4j” z wyjątkiem jednego (najwyżej jeden ") jako

<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

Byliśmy stoi podobny problem i okazało się, mieliśmy 2 niekompatybilne wersje SLF4J słoików w ścieżce klasy . ścieżce klasy się następujące 2 niekompatybilne wersje. Po usunięciu mniejsze wersje ze ścieżki klasy, problem ten został rozwiązany.

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

Rozwiązany !!!

Byłem zależny od innego projektu, który korzystał z wtyczki JavaDoc. Wtyczka JavaDoc używa wewnętrznie Maven-core i Maven-core-2.2.1 używa jcl-over-slf4j: 1.5.6. Maven-core to słoik poziomu nadrzędnego.

Teraz, ze względu na ten słoik JCL, stanąłem w obliczu tego problemu. Dlatego usunąłem go z folderu lib z weblogic (lub dowolnego serwera, z którego korzystasz).

ALAS !! Problem został rozwiązany.

Uwaga 1: - Można także użyć znacznika Maven <exclusion>, aby usunąć tę zależność z JavaDoc (lub dowolnej innej wtyczki) w celu rozwiązania tego problemu.

Uwaga 2: - Użyj zakładki Dependency Hierarchy w POM, aby zobaczyć, czy są tam jakieś stare słoiki z numerem SLF4J. I usuń resztę i zachowaj tylko jedną wersję.

Nadzieja to pomaga ..

0

Dzieje się tak zwykle, gdy masz zależności, które używają tego samego przechodnia zależność. Oznacza to, że 2 z twoich zależności (lub twojej aplikacji i przejściowej zależności) używają SLF4J wewnętrznie z różnymi wersjami. Ale twoja aplikacja może używać tylko jednej wersji klasy w tym samym czasie, więc musi wybrać (nie znasz reguł tutaj ... losowo?)

Aby rozwiązać problem, zwykle musisz zrobić mvn dependency:tree, aby zobaczyć, które używają różnych wersji SLF4J.

Dodanie tego uzależnienia rozwiązał problem dla mnie

<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> 
Powiązane problemy