2017-05-20 5 views
2

Ich benutze Sturm mit Python. Ich habe diesen Befehl, um die Topologie lokalNoSuchMethodError: org.slf4j

mvn compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=my.Topology 

und bekam diesen Fehler

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.log4j.Category.differentiatedLog(Category.java:186) 
at org.apache.log4j.Category.info(Category.java:229) 

ich diesen Befehl ausführen mvn dependency:tree die Versionen von slf4j zu sehen, und hier ist der Teil des slf4j Ich habe

org.apache.storm:storm-core:jar:0.9.6:provided 
[INFO] +- org.clojure:clojure:jar:1.5.1:provided 
[INFO] +- clj-time:clj-time:jar:0.4.1:provided 
[INFO] +- joda-time:joda-time:jar:2.0:provided 
[INFO] +- compojure:compojure:jar:1.1.3:provided 
[INFO] +- org.clojure:core.incubator:jar:0.1.0:provided 
[INFO] +- org.clojure:tools.macro:jar:0.1.0:provided 
[INFO] +- clout:clout:jar:1.0.1:provided 
[INFO] +- ring:ring-core:jar:1.1.5:provided 
[INFO] +- commons-fileupload:commons-fileupload:jar:1.2.1:provided 
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided 
[INFO] +- hiccup:hiccup:jar:0.3.6:provided 
[INFO] +- ring:ring-devel:jar:0.3.11:provided 
[INFO] +- clj-stacktrace:clj-stacktrace:jar:0.2.2:provided 
[INFO] +- ring:ring-jetty-adapter:jar:0.3.11:provided 
[INFO] +- ring:ring-servlet:jar:0.3.11:provided 
[INFO] +- org.mortbay.jetty:jetty:jar:6.1.26:provided 
[INFO] +- org.mortbay.jetty:jetty-util:jar:6.1.26:provided 
[INFO] +- org.clojure:tools.logging:jar:0.2.3:provided 
[INFO] +- org.clojure:math.numeric-tower:jar:0.0.1:provided 
[INFO] +- org.clojure:tools.cli:jar:0.2.4:provided 
[INFO] +- commons-io:commons-io:jar:2.4:provided 
[INFO] +- org.apache.commons:commons-exec:jar:1.1:provided 
[INFO] +- commons-lang:commons-lang:jar:2.5:provided 
[INFO] +- com.googlecode.json-simple:json-simple:jar:1.1:provided 
[INFO] +- com.twitter:carbonite:jar:1.4.0:provided 
[INFO] +- com.esotericsoftware.kryo:kryo:jar:2.21:provided 
[INFO] +- 
    com.esotericsoftware.reflectasm:reflectasm:jar:shaded:1.07:provided 
[INFO] +- org.ow2.asm:asm:jar:4.0:provided 
[INFO] +- com.esotericsoftware.minlog:minlog:jar:1.2:provided 
[INFO] +- org.objenesis:objenesis:jar:1.2:provided 
[INFO] +- com.twitter:chill-java:jar:0.3.5:provided 
[INFO] +- org.yaml:snakeyaml:jar:1.11:provided 
[INFO] +- commons-logging:commons-logging:jar:1.1.3:provided 
[INFO] +- commons-codec:commons-codec:jar:1.6:provided 
[INFO] +- com.googlecode.disruptor:disruptor:jar:2.10.4:provided 
[INFO] +- org.jgrapht:jgrapht-core:jar:0.9.0:provided 
[INFO] +- ch.qos.logback:logback-classic:jar:1.0.13:provided 
[INFO] +- ch.qos.logback:logback-core:jar:1.0.13:provided 
[INFO] +- org.slf4j:slf4j-api:jar:1.7.5:provided 
[INFO] +- org.slf4j:log4j-over-slf4j:jar:1.6.6:provided 
[INFO] \- jline:jline:jar:2.11:provided 

Mein POM

Antwort

2

Herausgegeben Antwort

ich mit meinem ersten Verdacht falsch war, dass dies ein Problem zur Verfügung gestellt bzw. -umfang Abhängigkeiten kompilieren, wie Sie das Programm mit classpathScope=compile beginnen.

Die slf4 API wird gefunden, sonst wäre die Fehlermeldung ClassNotFoundError gewesen.

Das Problem ist, dass log4j will die folgende Methode nennen:

void log(Marker marker, String fqcn, int level, String message, Object[] argArray, Throwable t) 

, die 1.7.5 in dem slf4j api in Version definiert ist (es seit Version gibt es in 1.3 nach dem Javadocs).

Die einzige Erklärung für diesen Fehler ist, dass es auf Ihrem Klassenpfad eine andere Version von slf4j-api.jar geben muss, die diese Methode noch nicht hat und die beim Laden der LocationAwareLogger-Schnittstelle verwendet wird.

Bitte überprüfen Sie die Ausgabe von

mvn dependency:tree 

für andere Vorkommen von slf4j-api, vielleicht irgendwo im Baum versteckt.

Eine andere Möglichkeit zu finden, wo die Klasse geladen wird, aus, indem Sie den folgenden Code ist (taking from this question):

Class clazz = Class.forName("org.slf4j.spi.LocationAwareLogger"); 
    URL resourceUrl = clazz.getResource("/" + clazz.getCanonicalName().replace(".", "/") + ".class"); 
    System.out.println(resourceUrl.toString()); 

Update:

Also, wenn das Programm mit mvn exec läuft gibt es eine slf4j -api geladen mit Version 1.5.6 (Willkommen in der Abhängigkeit maven Abhängigkeit). Können Sie die komplette pom.xml Ihres Projekts zeigen? Hat es einen Elternteil oder andere Abhängigkeiten? Was passiert, wenn Sie explizit eine Abhängigkeit von der benötigten Version von slf4j-api hinzufügen, indem Sie:

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

Update:

Das Problem aus der exec-Maven-Plugin kommt, wird dies das Laden der älteren Version von slf4j-api.Wenn Sie die folgende Zeile aus der Konfiguration des Plug-In entfernen:

<includePluginDependencies>true</includePluginDependencies> 

dann der eigentlichen slf4j-api geladen wird. Sie könnten den Wert auch auf false setzen, aber das ist sowieso der Standardwert. Ich denke nicht, dass Sie die Plugin-Abhängigkeiten einbeziehen sollten, wenn Sie das Paket Ihres Projekts erstellen, das Sie auch nicht haben. In der Dokumentation zu diesem Parameter heißt es:

Also denke ich, dass das Entfernen dieser Zeile oder das Setzen des Wertes auf false Ihr Problem lösen wird.

+0

danke für die antwort, aber meine pom enthält nichts über slf4j. also habe ich es nicht angegeben. Wie kann ich das überprüfen? – user5520049

+0

Es wird transitiv im Sturm benötigt, Sie müssen sicherstellen, dass Ihre Laufzeitumgebung diese Bibliotheken im Klassenpfad hat. Wie ist die Abhängigkeit von Sturm definiert? –

+0

Entschuldigung, meinst du, ich sollte den Bibliotheksordner im Sturm überprüfen? Als ich es überprüft und zwei Dateien für slf4j gefunden habe, habe ich es entfernt. aber ich fand diese Datei in m2/repository/org. Was soll ich danach machen? Ich poste meinen Pom in der Frage Post. Danke für Ihre Geduld – user5520049

Verwandte Themen