2016-12-30 5 views
1

Ich versuche einen Sturm LocalCluster mit Sturm-Kern 1.0.2 und Kafka-Auslauf 1.0.2 zu laufen.Storm-Kafka: java.lang.NoClassDefFoundError: com/google/common/base/Strings

Meine pom-Datei sieht aus wie unten

<dependencies> 
    <!-- Storm Dependency --> 
    <dependency> 
     <groupId>org.apache.storm</groupId> 
     <artifactId>storm-core</artifactId> 
     <version>1.0.2</version> 
     <scope>provided</scope> 
    </dependency> 

    <!-- Storm Kafka Dependency --> 
    <dependency> 
     <groupId>org.apache.storm</groupId> 
     <artifactId>storm-kafka</artifactId> 
     <version>1.0.2</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.apache.zookeeper</groupId> 
       <artifactId>zookeeper</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
..... 
</dependencies> 
<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
     </resource> 
    </resources> 
    <plugins> 

     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <archive> 
        <manifest> 
         <mainClass>com.walmartlabs.midas.storm.Topology</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>1.2.1</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>exec</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <executable>java</executable> 
       <includeProjectDependencies>true</includeProjectDependencies> 
       <includePluginDependencies>false</includePluginDependencies> 
       <classpathScope>compile</classpathScope> 
       <mainClass>${storm.topology}</mainClass> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Ich verwende folgenden Befehl ein Sturm Cluster lokal auszuführen.

mvn package 
storm jar target/myproject-0.1-SNAPSHOT-jar-with-dependencies.jar com.company.project.storm.Topology 

Ich erhalte folgende Ausnahme

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/base/Strings 
    at org.apache.storm.kafka.KafkaSpout.declareOutputFields(KafkaSpout.java:184) 
    at org.apache.storm.topology.TopologyBuilder.getComponentCommon(TopologyBuilder.java:431) 
    at org.apache.storm.topology.TopologyBuilder.createTopology(TopologyBuilder.java:135) 
    at com.walmartlabs.midas.storm.Topology.submitLocalTopology(Topology.java:50) 
    at com.walmartlabs.midas.storm.Topology.main(Topology.java:75) 
Caused by: java.lang.ClassNotFoundException: com.google.common.base.Strings 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 

Die Google gemeinsame Abhängigkeit ist, dass der Sturm-kafka Artefakt. Und ich habe den Umfang von Storm-Kafka als Standard festgelegt, so dass ich glaube, dass alle seine Abhängigkeiten in meinem Jar gebaut werden sollten.

Wenn ich KafkaSpout durch eine einfache Tülle ersetzen, die gerade einige Dateien liest, funktioniert alles gut. Ich glaube, beim Verpacken des Glases verpacke ich nicht alle Abhängigkeiten von Sturm-Kafka-Artefakten. Was ist hier falsch?

+0

Wären Sie in der Lage, die Ergebnisse von 'mvn Abhängigkeit: Baum' zu teilen. Der Trace könnte ziemlich groß sein, also vielleicht einen Textlink bereitstellen. – maffo

Antwort

0

Ich bekomme dieses Problem, und sovled durch Hinzufügen der Abhängigkeit wie unten (ps: guava.jar Version ist 16.0.1 von storm1.0.3 verwendet). Durch den Weg, können wir die Guave-Version von storm- verweisen Anlasser.

 <dependency> 
      <groupId>com.google.guava</groupId> 
      <artifactId>guava</artifactId> 
      <version>${guava.version}</version> 
      <!--<version>16.0.1</version>--> 
     </dependency> 
Verwandte Themen