【问题标题】:Why does Kafka consumer throw "java.lang.NoClassDefFoundError: kafka/consumer/ConsumerConfig" at startup?为什么 Kafka 消费者在启动时会抛出“java.lang.NoClassDefFoundError: kafka/consumer/ConsumerConfig”?
【发布时间】:2015-11-03 11:33:31
【问题描述】:

我正在尝试 apache 网站中给出的示例中的基本消费者代码。编译没问题。但是我在使用命令 java -jar target/JarName.jar 运行时遇到 ClassNotFoundException:

Exception in thread "main" java.lang.NoClassDefFoundError: kafka/consumer/ConsumerConfig
    at com.package.ConsumerClass.functionConsumer(ConsumerClass.java:41)
    at com.package.App.main(App.java:26)
Caused by: java.lang.ClassNotFoundException: kafka.consumer.ConsumerConfig
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)

源码是

package com.package;
import java.util.HashMap;
import java.util.Properties;
import java.util.Map;
import java.util.List;
import java.lang.Object;
import kafka.consumer.Consumer;
import kafka.consumer.ConsumerConfig;
import kafka.consumer.ConsumerConnector;
import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;
public class ExampleConsumer {
    public void exampleConsumer(){
        Properties props = new Properties();
        props.put("zk.connect", "localhost:2181");
        props.put("zk.connectiontimeout.ms", "1000000");
        props.put("groupid", "test_group");

        ConsumerConfig consumerConfig = new ConsumerConfig(props);
        ConsumerConnector consumerConnector = (ConsumerConnector) Consumer.createJavaConsumerConnector(consumerConfig);

        Map<String, Object> topicCountMap = new HashMap<String, Object>();
        topicCountMap.put("test", new Integer(1));
        Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = (Map<String, List<KafkaStream<byte[], byte[]>>>) consumerConnector.createMessageStreams((scala.collection.Map<String, Object>) topicCountMap);
        KafkaStream<byte[], byte[]> stream = consumerMap.get("test").get(0);
        ConsumerIterator<byte[], byte[]> it = stream.iterator();
        while(it.hasNext())
            System.out.println(new String(it.next().message()));
    }
}

我正在使用 Maven 进行依赖解析。 pom.xml 的依赖部分是这样的

<dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka_2.10</artifactId>
        <version>0.8.2.1</version>
        <scope>compile</scope>
</dependency>
        <dependency>
                <groupId>org.apache.kafka</groupId>     
                <artifactId>kafka-clients</artifactId>
                <version>0.8.2.1</version>
                <scope>compile</scope>
        </dependency>

我使用的是 kafka_2.10-0.8.2.1 版本。欢迎提出任何建议。

【问题讨论】:

    标签: java scala maven apache-kafka


    【解决方案1】:

    你为什么使用 kafka.consumer.ConsumerConfig?你应该使用:

    import org.apache.kafka.clients.consumer.KafkaConsumer;
    import org.apache.kafka.clients.consumer.ConsumerRecords;
    import org.apache.kafka.clients.consumer.ConsumerRecord;
    
    KafkaConsumer<String, String> consumer = new KafkaConsumer
             <String, String>(props);
    

    【讨论】:

      【解决方案2】:

      java -jar target/JarName.jarJarName.jar 内部运行Main-Class 没有 像Kafka 的依赖项。由于您的应用程序确实需要类路径上的依赖项 jar,因此您应该使用 How can I create an executable JAR with dependencies using Maven? 中解释的解决方案或自己构建类路径。

      顺便说一句,它与 Kafka 无关,只是您为它开发了一个客户端。

      附言考虑使用 Scala 和 sbt(或者可能是 gradle),你的生活就会变得如此轻松。

      【讨论】:

        猜你喜欢
        • 2019-12-06
        • 2019-11-27
        • 2020-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-14
        相关资源
        最近更新 更多