2017-05-20 1 views
2

J'utilise storm avec python. J'ai utilisé cette commande pour exécuter la topologie localementNoSuchMethodError: org.slf4j

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

et obtenu cette erreur

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) 

J'ai utilisé cette commande mvn dependency:tree pour voir les versions de slf4j et est ici la partie de slf4j je suis arrivé

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 

Mon POM

<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>Sim</groupId> 
<artifactId>Project</artifactId> 
<packaging>jar</packaging> 
<version>1.0-SNAPSHOT</version> 
<name>Pro</name> 
<url>http://maven.apache.org</url> 
<dependencies> 
    <dependency> 
    <groupId>org.apache.storm</groupId> 
    <artifactId>storm-core</artifactId> 
    <version>0.9.6</version> 
    <scope>provided</scope> 
    </dependency> 
    </dependencies> 
    <build> 
    <resources> 
     <resource> 
     <directory> ${basedir}/multilang</directory> 
     </resource> 
    </resources> 
<plugins> 
<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
    <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       </configuration> 
      <executions> 
       <execution> 
        <id>make-assembly</id> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>1.5.0</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>exec</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <executable>java</executable> 
    <includeProjectDependencies>true</includeProjectDependencies> 
    <includePluginDependencies>true</includePluginDependencies> 
    <classpathScope>compile</classpathScope>         
    <mainClass>Sim.Topology</mainClass> 
          </configuration> 
        </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
          <version>2.3</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
    </plugins> 

Répondre

2

Edité réponse

Je me suis trompé avec mon premier soupçon que c'est un problème de dépendances fournies ou compilent de portée, que vous démarrez le programme avec classpathScope=compile.

L'API slf4 est trouvée, sinon le message d'erreur aurait été ClassNotFoundError.

Le problème est que log4j veut appeler la méthode suivante:

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

qui est défini dans l'api SLF4J dans la version 1.7.5 (il est là depuis la version 1.3 selon la Javadocs). La seule explication de cette erreur est qu'il doit y avoir une autre version de slf4j-api.jar sur votre chemin de classe qui n'a pas encore cette méthode et qui est utilisée lors du chargement de l'interface LocationAwareLogger.

S'il vous plaît vérifier la sortie de

mvn dependency:tree 

pour d'autres occurrences de slf4j-api, peut-être caché quelque part dans l'arbre.

Une autre possibilité de trouver où la classe est chargée à partir est en utilisant le code suivant (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()); 

Mise à jour:

Ainsi lors de l'exécution du programme avec mvn exec il y a une slf4j -api chargé avec la version 1.5.6 (bienvenue à l'enfer de la dépendance maven). Pouvez-vous montrer le pom.xml complet de votre projet? A-t-il un pom parent ou d'autres dépendances introduites? Qu'advient-il si vous ajoutez explicitement une dépendance à la version requise de slf4j-api en ajoutant:

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

Mise à jour:

Le problème vient de l'exec-maven-plugin, cela est en train de charger l'ancienne version de slf4j-api.Lorsque vous supprimez la ligne suivante de la configuration du plug-in:

<includePluginDependencies>true</includePluginDependencies> 

alors la slf4j-api réelle est chargé. Vous pouvez également définir la valeur false, mais c'est la valeur par défaut de toute façon. Je ne pense pas que vous devriez avoir besoin d'inclure les dépendances du plugin, quand vous construisez le paquet de votre projet, vous ne les avez pas non plus. La documentation de ce paramètre indique:

Indicates if this plugin's dependencies should be used when executing the main class. This is useful when project dependencies are not appropriate. Using only the plugin dependencies can be particularly useful when the project is not a java project. For example a mvn project using the csharp plugins only expects to see dotnet libraries as dependencies.

Je pense donc que supprimer cette ligne ou définir la valeur sur false résoudra votre problème.

+0

merci de répondre, mais mon pom ne contient rien à propos de slf4j. donc je ne l'ai pas défini fourni. comment puis-je vérifier cela? – user5520049

+0

il est transitoirement requis par tempête, vous devez vous assurer que votre environnement d'exécution a ces bibliothèques sur le chemin de classe. Comment la dépendance à la tempête est-elle définie? –

+0

excusez-moi, voulez-vous dire que je devrais vérifier le dossier de la bibliothèque dans la tempête? comme je l'ai vérifié et trouvé deux fichiers pour slf4j je l'ai enlevé. mais j'ai trouvé ces fichiers dans m2/repository/org. que devrais-je faire après ça? Je poste mon pom dans le poste de question. Merci pour votre patience – user5520049