【问题标题】:Storm-Kafka : java.lang.NoClassDefFoundError: com/google/common/base/Strings风暴卡夫卡:java.lang.NoClassDefFoundError:com/google/common/base/Strings
【发布时间】:2017-05-14 07:42:22
【问题描述】:

我正在尝试使用storm-core 1.0.2 和kafka-spout 1.0.2 运行一个storm LocalCluster。

我的 pom 文件如下所示

  <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>

我使用以下命令在本地运行风暴集群。

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

我得到以下异常

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) 

google常见的依赖是storm-kafka artifact。而且我已经将storm-kafka的范围设置为默认值,所以我相信它的所有依赖项都应该构建在我的jar中。

如果我用一个简单的 spout 替换 KafkaSpout,它只是读取一些文件,一切正常。 我相信在打包 jar 时我没有打包storm-kafka artifact 的所有依赖项。这里有什么问题?

【问题讨论】:

  • 你能分享mvn dependency:tree的结果吗?跟踪可能非常大,因此可能提供一个文本箱链接。

标签: maven apache-kafka apache-storm


【解决方案1】:

我遇到了这个问题,并通过添加如下依赖项来解决(ps:guava.jar 版本是storm1.0.3使用的16.0.1)。顺便可以参考storm-starter使用的guava版本。

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

【讨论】:

    【解决方案2】:

    https://github.com/apache/storm/tree/v1.0.2/external/storm-kafka#using-storm-kafka-with-different-versions-of-kafka

    Storm 1.0.2 将工件“kafka_[scala_version]”的范围更改为“provided”,这意味着您需要将其添加为依赖项。这是为了在 scala 版本和/或 kafka 版本上灵活组合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-15
      • 2018-07-28
      • 1970-01-01
      • 2016-02-04
      • 2023-03-05
      • 2021-02-12
      • 2014-12-12
      • 1970-01-01
      相关资源
      最近更新 更多