当我尝试编译并运行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告诉我以下
该课程的代码是
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++;
}
}
}
有人能指出我正确的方向来解决这个错误吗?由于某种原因,课程是否需要进入不同的目录?
答案 0 :(得分:2)
包名称是您需要在命令行上提供的类名称的一部分:
javac -cp $KCORE:$KCLIENT:$SCORE:. kafka.examples.Producer
此外,您应该站在类层次结构的根目录中,该目录似乎是两个目录(您当前位于kafka/examples
。或者,您可以使用../..
而不是.
参数中的-cp
来表示根是两个目录。
您可能希望熟悉使用诸如IntelliJ IDEA或Eclipse之类的IDE(以及如何在这些IDE中使用库),因为这将使开发更容易。不过,首先要通过艰难的方式处理道具,因为您可以更好地理解事物是如何拼接在一起的(IDE将基本上为您提供所有这些控制台命令,而无需您注意)。