Warum muss ich immer NoSuchMethodError auf LocationAwareLogger beim laufen Jetty?
Ich versuche einbetten Jetty-Servers in meine automatisierte tests, so dass ich Hinzugefügt habe, wird die folgende dependency in meinem Projekt:
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>7.6.13.v20130916</version>
<scope>test</scope>
</dependency>
Ich bin mit Jetty 7, weil die Web-app nutzt Java 6, Servlet 2.5.
Jedoch, wenn ich versuche zu starten, embedded Jetty-server habe ich bekommen:
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.eclipse.jetty.util.log.JettyAwareLogger.log(JettyAwareLogger.java:607)
at org.eclipse.jetty.util.log.JettyAwareLogger.warn(JettyAwareLogger.java:431)
at org.eclipse.jetty.util.log.Slf4jLog.warn(Slf4jLog.java:69)
at org.eclipse.jetty.util.component.AbstractLifeCycle.setFailed(AbstractLifeCycle.java:204)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:74)
Ich habe versucht, herauszufinden, was falsch ist, aber keiner der Schritte, die ich gemacht habe bisher das Problem behebt. Hier ist eine Liste von dem, was ich bisher getan habe:
- Trace transitiven Abhängigkeiten die Suche nach inkompatiblen Versionen von
slf4j-api
- Versuchen, verschiedene Varianten
slf4j-api
(1.5.11, 1.6.1, 1.6.4, 1.7.5) - Schaute in die einige Quellen von Jetty 7 besonders die pom.xml und gefunden, dass es eine Abhängigkeit zu slf4j 1.6.1
- Sah in eine ähnliche Frage und bekam
null
wenn Sie versuchen, zu druckenorg.slf4j.spi.LocationAwareLogger
, undorg.slf4j.Marker
Ich hoffe mir kann jemand einen frischen Einblick in dieses Problem. Danke.
Haben Sie versucht, geben Sie <Ausgrenzung> für slf4j auf der jetty-servlet-Abhängigkeit?
jetty-servlet nicht scheinen, um die transitive Abhängigkeit zu slf4j, das scheint seltsam.
jetty-servlet nicht scheinen, um die transitive Abhängigkeit zu slf4j, das scheint seltsam.
InformationsquelleAutor Psycho Punch | 2013-09-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Wette, Sie haben vor ein Kompatibilität problem zwischen
sl4j
Gläser. Versuchen examinatingmvn dependency:tree
Ausgabe Ihre endgültige Artefakt. Vielleicht haben Sie zwei verschiedene Versionen einigersl4j
Glas und man kann nicht Vorhersagen, welche Belastungen zuerst. Versuchen Sie zu glätten allesl4j
Versionen.OP: Bitte beachten Sie die eine Dokumentation, wie ich dieses Problem gelöst.
Wenn es keine
sl4j
Gläser überhaupt, dann würden Sie bekamNoClassDefFoundError
alsJettyAwareLogger
enthält Verweise aufsl4j
SPI-Klassen. Also, die Klassen, die vorhanden sind, zur Laufzeit. Wo sind Sie gekommen? Vielleicht ist es Ihnen containerlib
Ordner? Oder vielleicht sind Sie angewiesen auf eine neu gepackte jar, die bereits enthältsl4j
Klassen?Kennen Sie eine Weise könnte ich dies überprüfen? Was ich bisher gemacht habe ist, da bin ich mit Eclipse importieren
LocationAwareLogger
in jeder Klasse, dann versuchen Sie zu verfolgen, um zu überprüfen, wenn es immer importiert aus derslf4j
jar in den build-Pfad. Ich kann nicht importieren, wenn ich nicht eine Abhängigkeit zuslf4j
, aber als Sie bemerkt haben, ich bin nicht immer einNoClassDefFoundError
, die hab ich auch schon versucht, absichtlich zu erhöhen.1 Starten Sie die JVM mit
-verbose:class
option oder 2 Während in Eclipse-debug-stop auf jeden Haltepunkt und zeigenDisplay
anzeigen. Geben Sieorg.slf4j.spi.LocationAwareLogger.class.getResource(org.slf4j.spi.LocationAwareLogger.class.getSimpleName() + ".class")
, wählen Sie und drücken SieDisplay Result of Evaluating Selected Text
. Du wirst sehen, wo die Klasse kommen.Bei Verwendung von Steg-standalone verwenden
$ java -jar start.jar --version
den server sehen und classpath. Dann schau auf deine webapp istWEB-INF/lib
Baum. Schließlich, legen Sie diejetty.dump.start
in Ihrem standalone-jetty zutrue
zu sehen, einen dump der webapp classpath.InformationsquelleAutor madhead
Die Informationen auf madhead's Antwort war sehr hilfreich, aber ich werde das alles dokumentieren die details von dem, was ich getan habe, zum Wohle für andere, die (Ihnen) begegnet das gleiche problem.
Als Antwort erwähnt, vorgeschlagen, es war ein problem mit
slf4j
Gläser. Um zu überprüfen, habe ich Folgendes:slf4j
.Display Result of Evaluating Selected Text
deaktiviert wurde zunächst für einige Grund.slf4j
wurde noch Hinzugefügt, in der classpath-unabhängig davon, ob ich angegeben Ausgrenzung.slf4j-jdk14 1.5.8
, so dass ich nur aktualisiert, es1.6.1
.slf4j-api
unterslf4j-jdk14 1.6.1
denn es bezog sich auf die version 1.5.8, und fügen Sie direkte Abhängigkeit zuslf4j-api 1.6.1
.InformationsquelleAutor Psycho Punch