Java 如何修复Kafka Producer示例的NoClassDefFoundError?

Java 如何修复Kafka Producer示例的NoClassDefFoundError?,java,scala,virtual-machine,redhat,apache-kafka,Java,Scala,Virtual Machine,Redhat,Apache Kafka,当我试图编译和运行Kafka附带的Producer示例时,我遇到了一个NoClassDefFoundError。我想知道如何解决下面讨论的错误 警告:我是一名C++/C#程序员,精通Linux,并开始 学习Java。我可以按照指示去做,但也可以要求一些 一路上的澄清 我有一个来自Hortonworks的VM沙盒,它运行着一个Red Hat设备。在它上面,我有一个工作的卡夫卡服务器,通过遵循这一点,我能够得到所需的生产者张贴消息到服务器 现在我想开始写我自己的代码,但首先我决定确保我可以编译Kaf

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

警告:我是一名C++/C#程序员,精通Linux,并开始 学习Java。我可以按照指示去做,但也可以要求一些 一路上的澄清

我有一个来自Hortonworks的VM沙盒,它运行着一个Red Hat设备。在它上面,我有一个工作的卡夫卡服务器,通过遵循这一点,我能够得到所需的生产者张贴消息到服务器

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

以下是我正在做的:

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

javac-cp$KCORE:$KCLIENT:$SCORE:../*。爪哇

$KCORE:$KCLIENT:$SCORE分别解析kafka核心、kafka客户端和scala库的JAR。一切正常返回,没有错误,并将所有类文件放在当前目录中;然而,当我跟进

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

我得到一个NoClassDefFound错误告诉我

该类的代码是

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

}
packafka.examples;
导入java.util.Properties;
导入kafka.producer.KeyedMessage;
导入kafka.producer.ProducerConfig;
公共类生产者扩展线程
{
私有最终kafka.javaapi.producer.producer;
私有字符串主题;
私有最终属性props=新属性();
公共制作人(字符串主题)
{
put(“serializer.class”、“kafka.serializer.StringEncoder”);
put(“metadata.broker.list”,“localhost:9092”);
//使用随机分区器。不需要密钥类型。只需将其设置为整数即可。
//消息的类型为字符串。
producer=new kafka.javaapi.producer.producer(new ProducerConfig(props));
this.topic=主题;
}
公开募捐{
int messageNo=1;
while(true)
{
String messageStr=新字符串(“消息”+messageNo);
send(新的KeyedMessage(主题,messageStr));
messageNo++;
}
}
}

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

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

javac -cp $KCORE:$KCLIENT:$SCORE:. kafka.examples.Producer
此外,您应该站在类层次结构的根目录中,该目录似乎向上两个目录(您当前站在
kafka/examples
中)。或者,您可以使用
。/..
而不是
-cp
参数中的
来表示根目录向上两个目录


您可能希望熟悉IntelliJ IDEA或Eclipse等IDE的使用(以及如何在这些IDE中使用库),因为这将使开发变得更加容易。不过,首先要做的是艰难的事情,因为您将更好地理解如何将事情缝合在一起(IDE将基本上为您提供所有的控制台命令,而您没有注意到)。< /P>此答案是正确的,请考虑将此添加到卡夫卡的bin文件夹中的KAFKA Run-Calase.Sh中的类路径中。