Storm ClassNotFoundException

时间:2013-05-16 22:12:50

标签: apache-storm

我第一次使用Storm(从暴风雨开始学习),我的项目在运行时因ClassNotFoundException而失败:

[WARNING]
java.lang.ClassNotFoundException: TopologyMain
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:285)
    at java.lang.Thread.run(Unknown Source)

这些是TopologyMain和pom文件:

import spouts.WordReader;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.tuple.Fields;
import bolts.WordCounter;
import bolts.WordNormalizer;


public class TopologyMain {
public static void main(String[] args) throws InterruptedException {

    //Topology definition
    TopologyBuilder builder = new TopologyBuilder();
    builder.setSpout("word-reader",new WordReader());
    builder.setBolt("word-normalizer", new WordNormalizer())
        .shuffleGrouping("word-reader");
    builder.setBolt("word-counter", new WordCounter(),1)
        .fieldsGrouping("word-normalizer", new Fields("word"));

    //Configuration
    Config conf = new Config();
    conf.put("wordsFile", args[0]);
    conf.setDebug(false);
    //Topology run
    conf.put(Config.TOPOLOGY_MAX_SPOUT_PENDING, 1);
    LocalCluster cluster = new LocalCluster();
    cluster.submitTopology("Getting-Started-Toplogie", conf, builder.createTopology());
    Thread.sleep(1000);
    cluster.shutdown();
}
}

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/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>storm.book</groupId>
  <artifactId>Getting-Started</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <build>
   <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
         <version>2.3.2</version>
        <configuration>
      <source>1.6</source>
      <target>1.6</target>
      <compilerVersion>1.6</compilerVersion>
    </configuration>
  </plugin>
 </plugins>

    <!-- Repository where we can found the storm dependencies  -->
    <repository>
        <id>clojars.org</id>
        <url>http://clojars.org/repo</url>
    </repository>

    <!-- Storm Dependency -->
    <dependency> 
      <groupId>storm</groupId>
      <artifactId>storm</artifactId>
      <version>0.7.1</version>
   </dependency>

我对风暴并不是很了解,这是针对学校项目所以请帮忙

5 个答案:

答案 0 :(得分:7)

你应该发起:

mvn -f pom.xml clean install

这将在目标目录中创建jar文件 之后,您可以使用此命令执行拓扑:

mvn exec:java -Dexec.mainClass="TopologyMain" -Dexec.args="src/main/resources/words.txt"
祝你好运!

答案 1 :(得分:1)

如果我没有错,你正在创建jar然后尝试提交它。可能在您的类路径中,您的TopologyMain类未正确设置,或者您可能需要指定完全限定的路径或类似的路径。

答案 2 :(得分:1)

我第一次遇到暴风雨时也遇到了同样的问题。问题是我必须像这样使用完整的程序包名称运行TopologyMain类

storm jar <jar-name> <topologymain class with full package name>

enter image description here

如果发现依赖项类的任何 classNotFound异常,请尝试构建胖罐子。

答案 3 :(得分:0)

尝试添加以下maven插件

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <mainClass/>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

这将创建一个包含所有依赖项的JAR。确保您还指定了提供的风暴依赖性

<dependency>
    <groupId>org.apache.storm</groupId>
    <artifactId>storm-core</artifactId>
    <version>${storm.version}</version>
    <scope>provided</scope>
</dependency> 

答案 4 :(得分:0)

只要我看到,你在这里显示的文件似乎是正确的。如果您没有解决问题,请检查以下步骤。

mvn clean package -DskipTests=true
storm jar target/your-jar-file.jar storm.book.TopologyMain arg0

在上面的代码中,我假设您的$(PWD)是项目的根,并且风暴在您的系统中全局可用。这个风暴可执行文件不是你从头开始编译的,而是官方版本。 你应该知道风暴可执行程序依赖于系统的Python,如果你的操作系统是Windows,你应该检查风暴发布python脚本来运行你的应用程序。