如何修复 Kafka Producer Example 的 NoClassDefFoundError?

How to fix NoClassDefFoundError for Kafka Producer Example?

我在尝试编译和 运行 Kafka 附带的 Producer 示例时收到 NoClassDefFoundError。我想知道如何解决下面讨论的错误?

Caveat: I am a C++/C# programmer who is Linux literate and starting to learn Java. I can follow instructions, but may well ask for some clarification along the way.

我有一个来自 Hortonworks 的 VM 沙箱,它正在 运行 连接 Red Hat 设备。在它上面我有一个工作的 kafka 服务器并且通过遵循这个 tutorial 我能够获得所需的生产者将消息发布到服务器。

现在我想着手编写自己的代码,但首先我决定确保我可以编译 Kafka 附带的示例文件。经过一天的反复试验后,我似乎无法做到这一点。

这是我正在做的事情:

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

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

$KCORE:$KCLIENT:$SCORE 分别解析为 kafka 核心、kafka-client 和 scala 库的 jar。一切 returns 都很好,没有错误,并将所有 class 文件放在当前目录中;然而,当我跟进

javac -cp $KCORE:$KCLIENT:$SCORE:.制作人

我收到一个 NoClassDefFoundError 告诉我以下内容

class 的代码是

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++;
    }
  }

}

任何人都可以指出正确的方向来解决这个错误吗? classes 是否出于某种原因需要进入不同的目录?

包名称是 class 名称的一部分,您需要在命令行中提供:

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

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

您可能想熟悉使用 IDE,例如 IntelliJ IDEA 或 Eclipse(以及如何使用这些 IDE 中的库),因为这将使开发容易多了。不过,首先要以困难的方式做事,因为你会更好地理解事物是如何拼接在一起的(IDE 基本上会在你不注意的情况下为你计算所有这些控制台命令)。