NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()
Das Problem verursacht wurde, indem man die Abhängigkeiten in meinem pom.xml [cxf-bundle-jaxrs], welche intern eine niedrigere version von slf4j. Ich konnte dieses Problem beheben, aktualisieren diese Abhängigkeit auf die neueste Version. Vielen Dank an alle.
Ich versuche, fügen Sie Apache Shiro zu meinem CXF Frühling web-Anwendung. Wenn ich starte meine tomcat 7 bekomme ich folgende Fehlermeldung
Caused by: java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder;
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:121)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:268)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:241)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:254)
at org.apache.shiro.spring.LifecycleBeanPostProcessor.<clinit>(LifecycleBeanPostProcessor.java:51)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877)
... 25 more
und meine pom.xml für shiro und slf4j ist
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<scope>runtime</scope>
</dependency>
Ich habe versucht, jede mögliche Lösung durch googeln, aber kein Glück.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies bedeutet, dass Sie die Klasse
StaticLoggerBinder
in Ihren Klassenpfad ein.Aber die Klasse von Ihrem classpath nicht über die Methode
getSingleton()
Dies geschieht meist, wenn Sie Abhängigkeiten haben, die verwenden beide die gleiche transitive Abhängigkeit. Dies bedeutet, dass 2 von Ihren Abhängigkeiten (oder Ihre app, und eine transitive Abhängigkeit) sind beide mit SLF4J intern mit verschiedenen Versionen. Aber Ihre Anwendung kann nur eine einzige version der Klasse zur gleichen Zeit, so dass es zu wählen hat (weiß nicht, die Regeln hier... zufällig?)
Das problem zu lösen, müssen Sie in der Regel tun, eine
mvn dependency:tree
zu sehen, die mit verschiedenen Versionen von SLF4J.Oft die Lösung ist die Verwendung einer maven-dependency-Ausschluss auf der niedrigsten version. Bibliotheken wie SLF4J tendenziell retrocompatible was bedeutet, neuere Versionen halten das hinzufügen von mehr Funktionen. Manchmal, eine Methode, die entfernt wird, und dann haben Sie wieder die alte library-version, und beten. Wenn dies nicht funktioniert, gibt es noch einige Optionen, wie JarJar
Aber für logging-Bibliotheken, manchmal ist es ein bisschen anders, so dass meine Erklärung ist allgemeiner Zweck, aber es ist wahrscheinlich nicht die richtige logging-Bibliothek-Abhängigkeiten, denn Sie haben eine sehr spezielle Verpackungen, die nicht immer leicht zu verstehen 🙂
Schauen, was ich für Euch gefunden:
Den
getSingleton()
Methode erschien in der version 1.5.6, so ist es sehr wahrscheinlich, dass Sie haben eine Bibliothek, die verwendet SLF4J ältere version, die 1.5.6 🙂 Sie müssen nur ausschließen, es mit einem maven-Ausschluss (und beten).Edit: du solltest versuchen:
Besser, wenn Sie eine multimodule maven-Projekt mit einem übergeordneten pom können Sie dies mit maven-dependencyManagement xml-Knoten.
mvn dependency:tree
hier sind einige neue Anhaltspunkte: ich habe cxf-bundle-jaxrs 2.2 welche intern verwendetorg.slf4j:slf4j-jdk14:jar:1.3.1:runtime
Wie kann ich depedency Ausgrenzung, dieses Problem zu lösen? -Vielen DankMüssen Sie diese Abhängigkeit:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency>
slf4j-api
auf 1.7.5 oder downgradeslf4j-log4j12
zu 1.6.1Etwas scheint nicht kompatibel mit denen sl4j-api und log4j-Versionen.
Versuchen Sie diesen link und finden Sie die richtigen und kompatiblen Abhängigkeiten und nutzen Sie.
Werden kann, sollten Sie versuchen, die folgende Kombination,
Oder, wenn Sie planen, verwenden Sie version 1.6.1
java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/StaticLoggerBinder;
Hinzufügen dieser Abhängigkeit gelöst ist das Problem für mich