首页 > 解决方案 > 当 jar 与 Apache Storm 一起运行时,为什么会引发 java.lang.NoClassDefFoundError (org/apache/storm/kafka/spout/KafkaSpout)?

问题描述

我的问题与此处发现的问题非常相似:NoClassDefFoundError Apache Storm 我已经尝试了那里发布的所有解决方案,但我认为问题不一样。

我可以毫无问题地将我的 java 代码编译为 .jar,但是当我运行它时,出现以下错误。我在 pom 中包含了所有依赖项,但它仍然找不到它。该代码几乎直接从 Apache Storm 文档中复制而来,以删除任何其他可能出现问题的方面。

任何想法将不胜感激。

尝试在我的 Storm 集群上运行拓扑时收到以下错误消息:

Running: /usr/lib/jvm/java-8-openjdk-amd64/bin/java -client -Ddaemon.name= -Dstorm.options= -Dstorm.home=/home/hadoop/storm -Dstorm.log.dir=/home/hadoop/stormLog -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib:/usr/lib64 -Dstorm.conf.file= -cp /home/hadoop/storm/*:/home/hadoop/storm/lib-worker/*:/home/hadoop/storm/extlib/*:twitterTest2.jar:/home/hadoop/storm/conf:/home/hadoop/storm/bin: -Dstorm.jar=twitterTest2.jar -Dstorm.dependency.jars= -Dstorm.dependency.artifacts={} processingT.TTopology
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/kafka/spout/KafkaSpout
    at processingT.TTopology.run(TTopology.java:24)
    at org.apache.storm.topology.ConfigurableTopology.start(ConfigurableTopology.java:68)
    at processingT.TTopology.main(TTopology.java:16)
Caused by: java.lang.ClassNotFoundException: org.apache.storm.kafka.spout.KafkaSpout
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 3 more

我的 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.storm.processing</groupId>
  <artifactId>processingT</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
    <dependency>
        <groupId>org.apache.storm</groupId>
        <artifactId>storm-client</artifactId>
        <version>2.2.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.storm</groupId>
      <artifactId>storm-core</artifactId>
      <version>2.2.0</version>
    </dependency>   
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-clients</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.storm</groupId>
        <artifactId>storm-kafka-client</artifactId>
        <version>2.2.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.storm</groupId>
      <artifactId>storm-kafka</artifactId>
      <version>1.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.storm</groupId>
        <artifactId>storm-server</artifactId>
        <version>2.2.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.kafka</groupId>
      <artifactId>kafka_2.13</artifactId>
      <version>2.6.0</version>
      <exclusions>
        <exclusion>
          <groupId>org.apache.zookeeper</groupId>
          <artifactId>zookeeper</artifactId>
        </exclusion>
        <exclusion>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
        </exclusion>
      </exclusions>
      </dependency>
  </dependencies>
  
  
</project>

Java代码是:

package processingT;

import org.apache.storm.topology.ConfigurableTopology;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.kafka.spout.KafkaSpout;
import org.apache.storm.kafka.spout.KafkaSpoutConfig;
import org.apache.storm.tuple.Fields;

public class TTopology extends ConfigurableTopology {
    public static void main(String[] args) throws Exception {
        ConfigurableTopology.start(new TTopology(), args);
    }

    @Override
    protected int run(String[] args) throws Exception {
        String port = "9092";
        
        TopologyBuilder tp = new TopologyBuilder();
        tp.setSpout("kafka_spout", new KafkaSpout<>(KafkaSpoutConfig.builder("ip:" + port, "topic").build()), 1);
        tp.setBolt("countT", new CountTBolt(), 12).fieldsGrouping("kafka_spout", new Fields("word"));

        conf.setDebug(true);

        String topologyName = "count";

        conf.setNumWorkers(3);

        if (args != null && args.length > 0) {
            topologyName = args[0];
        }
        return submit(topologyName,conf,tp);
    }
}

标签: javamavenapache-kafkaapache-storm

解决方案


推荐阅读