如何修复Kafka Producer示例的NoClassDefFoundError?

时间:2015-07-02 20:36:10

标签: java scala virtual-machine redhat apache-kafka

当我尝试编译并运行Kafka附带的Producer示例时,我得到一个NoClassDefFoundError。我想知道如何解决下面讨论的错误?

  

警告:我是一名C ++ / C#程序员,他具备Linux知识并开始学习   学习Java。我可以遵循指示,但可能会要求一些   一路澄清。

我有一个来自Hortonworks的VM沙箱,它正在运行Red Hat设备。在它上面我有一个工作的kafka服务器,按照这个tutorial,我能够得到所需的Producer向服务器发布消息。

现在我想开始编写自己的代码,但首先我决定确保我可以编译Kafka附带的示例文件经过一天的试验和错误后,我似乎无法实现这一目标。

这是我正在做的事情:

我将转到示例文件所在的目录并输入:

javac -cp $ KCORE:$ KCLIENT:$ SCORE:。 ./*。java的

$ KCORE:$ KCLIENT:$ SCORE分别解析为kafka核心,kafka-client和scala库的jar。一切都返回正常,没有错误,并将所有类文件放在当前目录中;但是,当我跟进

javac -cp $ KCORE:$ KCLIENT:$ SCORE:。生产者

我收到NoClassDefFoundError告诉我以下Error screen shot

该课程的代码是

package kafka.examples;

import java.util.Properties;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;

public class Producer extends Thread
{
  private final kafka.javaapi.producer.Producer<Integer, String> producer;
  private final String topic;
  private final Properties props = new Properties();


  public Producer(String topic)
  {
    props.put("serializer.class", "kafka.serializer.StringEncoder");
    props.put("metadata.broker.list", "localhost:9092");
    // Use random partitioner. Don't need the key type. Just set it to Integer.
    // The message is of type String.
    producer = new kafka.javaapi.producer.Producer<Integer, String>(new ProducerConfig(props));
    this.topic = topic;
  }

  public void run() {
    int messageNo = 1;
    while(true)
    {
      String messageStr = new String("Message_" + messageNo);
      producer.send(new KeyedMessage<Integer, String>(topic, messageStr));
      messageNo++;
    }
  }

}

有人能指出我正确的方向来解决这个错误吗?由于某种原因,课程是否需要进入不同的目录?

1 个答案:

答案 0 :(得分:2)

包名称是您需要在命令行上提供的类名称的一部分:

javac -cp $KCORE:$KCLIENT:$SCORE:. kafka.examples.Producer

此外,您应该站在类层次结构的根目录中,该目录似乎是两个目录(您当前位于kafka/examples。或者,您可以使用../..而不是.参数中的-cp来表示根是两个目录。

您可能希望熟悉使用诸如IntelliJ IDEA或Eclipse之类的IDE(以及如何在这些IDE中使用库),因为这将使开发更容易。不过,首先要通过艰难的方式处理道具,因为您可以更好地理解事物是如何拼接在一起的(IDE将基本上为您提供所有这些控制台命令,而无需您注意)。