【问题标题】:java.lang.NoClassDefFoundError: org/apache/kafka/clients/producer/Producerjava.lang.NoClassDefFoundError: org/apache/kafka/clients/producer/Producer
【发布时间】:2019-05-30 19:18:32
【问题描述】:

我正在尝试使用 Kafka:

import java.util.Properties;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;

public class SimpleProducer {
    public static void main(String[] args) {
        Properties props = new Properties();
        Producer<String, String> producer = new KafkaProducer<String, String>(props);
    }
}

但出现以下错误:

java.lang.NoClassDefFoundError: org/apache/kafka/clients/producer/Producer

build.gradle:

...

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'org.apache.kafka', name: 'kafka-clients', version: '2.2.0'
}

...

【问题讨论】:

  • 您的SimpleProducer 运行情况如何?
  • Producer 类实际上在 kafka-clients-2.2.0.jar 文件中。当您运行该类时,该 jar 似乎不在您的类路径中。
  • @Harald 使用命令行
  • @user152468 如何将它放在我的类路径中?
  • 您似乎缺少 org.apache.kafka.clients.producer.KafkaProducer 和 java.util.Properties 的导入。您还需要使用 gradle 运行它,它将在类路径中包含 jar 文件。我建议为您的 gradle 版本查找如何使用 gradle 的“应用程序”插件(“gradle -version”)

标签: java gradle apache-kafka


【解决方案1】:

我跑了:

java -jar TestProejct-1.0-SNAPSHOT.jar -cp "D:\Software\kafka_2.12-2.2.0\libs\kafka-clients-2.2.0.jar"

有几个问题:

  1. java 不能同时接受 -jar 和 -cp,因此除了 Kafka 之外,我还必须将我的 jar 包含在类路径本身中。
  2. 我必须指定要运行的主类。
  3. 要从 Kafka 导入的 jar 不止一个,所以我必须指定 * insead of kafka-clients-2.2.0.jar。

这解决了问题:

java -cp "D:\Software\kafka_2.12-2.2.0\libs\*;TestProejct-1.0-SNAPSHOT.jar" SimpleProducer

【讨论】:

  • 嗨@Alon,我遇到了同样的错误。错误:无法找到或加载主类 SimpleProducer,但不知道为什么,在编译之前工作得很好。同样在你的回答中,你有这个“TestProejct-1.0-SNAPSHOT.jar”,你还知道那是什么吗?
【解决方案2】:

我曾尝试在 gradle 中使用以下依赖项。

compile group: 'org.apache.kafka', name: 'kafka-clients', version: '2.1.0'

另外,我在下面提供了我测试的代码 sn-p。

import java.util.Properties;
import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;

public class Producer {

    public static void main(String[] args){
        Properties properties = new Properties();
        properties.put("bootstrap.servers", "192.168.119.139:9092");
        properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        KafkaProducer kafkaProducer = new KafkaProducer(properties);
        TestCallback callback = new TestCallback();
        try{
            for(int i = 0; i < 100; i++){
                System.out.println("----->"+i);
                kafkaProducer.send(new ProducerRecord("test", Integer.toString(i), "test message - " + i ));
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            kafkaProducer.close();
        }
    }


    private static class TestCallback implements Callback {
        @Override
        public void onCompletion(RecordMetadata recordMetadata, Exception e) {
            if (e != null) {
                System.out.println("Error while producing message to topic :" + recordMetadata);
                e.printStackTrace();
            } else {
                String message = String.format("sent message to topic:%s partition:%s  offset:%s", recordMetadata.topic(), recordMetadata.partition(), recordMetadata.offset());
                System.out.println(message);
            }
        }
    }
}

我已经使用 Eclipse IDE 测试了这段代码。还要记住,apache kafka 客户端也会下载以下依赖。

  • zstd-jni-1.3.5-4.jar
  • lz4-java-1.5.0.jar
  • snappy-java-1.1.7.2.jar
  • slf4j-api-1.7.25.jar

如果你想使用命令运行,你必须通过使用一组 jar 文件指定 -classpath 来运行。我在下面提供一个示例。

java.exe -Dfile.encoding=UTF-8 -classpath somelocation/a.jar;somelocation/b.jar;somelocation/c.jar

如果仍然不能解决您的问题,请提供应用程序结构,发布代码详细信息,以便其他人可以帮助您。

【讨论】:

  • 使用 eclipse 或 intellij idea 等任何 ide 配置您的项目,然后运行它。
  • 我使用 InteliJ 开发/配置它,但通过命令行运行项目。它不起作用。
  • 在命令行中运行时使用 -cp 选项进行类路径设置。检查并了解 java -cp 选项。
  • 你能编译吗?您可以发布完整的错误详细信息吗?
  • 线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/kafka/clients/producer/Producer at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class。 privateGetDeclaredMethods(Unknown Source) at java.lang.Class.privateGetMethodRecursive(Unknown Source) at java.lang.Class.getMethod0(Unknown Source) at java.lang.Class.getMethod(Unknown Source) at sun.launcher.LauncherHelper.validateMainClass(未知来源)在 sun.launcher.LauncherHelper.checkAndLoadMain(未知来源)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 2017-12-25
相关资源
最近更新 更多