尝试在 Kafka 中创建分区时出现 NoClassDefFoundError

Posted

技术标签:

【中文标题】尝试在 Kafka 中创建分区时出现 NoClassDefFoundError【英文标题】:NoClassDefFoundError when trying to create partitions in Kafka 【发布时间】:2021-01-30 02:40:14 【问题描述】:

我有以下代码:

  public KafkaReader(KafkaConsumer<Long, byte[]> consumer, String topic) 
    this.consumer = consumer;
    this.topicPartition = new TopicPartition(topic, ((consumer.partitionsFor(topic).get(0)).partition()));
    consumer.assign(Collections.singleton(topicPartition));

但是在执行 consumer.partitionsFor(topic) 时出现以下错误:

java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/JsonNode

at org.apache.kafka.common.requests.MetadataRequest$Builder.<clinit>(MetadataRequest.java:36)
at org.apache.kafka.clients.consumer.KafkaConsumer.partitionsFor(KafkaConsumer.java:1962)
at org.apache.kafka.clients.consumer.KafkaConsumer.partitionsFor(KafkaConsumer.java:1930)
at data.KafkaReader.<init>(KafkaReader.java:20)
at data.KafkaReaderTest.playground(KafkaReaderTest.java:12)

... 引起:java.lang.ClassNotFoundException:com.fasterxml.jackson.databind.JsonNode 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) 在 java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 68 更多

在 pom.xml 中我定义了以下依赖项:

   <dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>$junit.jupiter.version</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-all</artifactId>
        <version>1.3</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>commons-cli</groupId>
        <artifactId>commons-cli</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-clients</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.10</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.10</version>
    </dependency>
</dependencies>

我发现的所有建议都是将 jackson-annotations 和 -core 添加到 maven 依赖项,但没有帮助。

【问题讨论】:

【参考方案1】:

这是 2.6 版本客户端的一个错误:https://issues.apache.org/jira/browse/KAFKA-10378

我建议在 2.6.1 或 2.7 发布之前坚持使用 2.5 客户端。除非有一个你不能没有的关键 2.6 特性,否则包含你自己的依赖项的建议是合理的。

【讨论】:

【参考方案2】:

ClassNotFoundException: com.fasterxml.jackson.databind.JsonNode

所以你需要

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.10</version>
</dependency>

但是,您确实应该使用jackson-bom 一致地导入所有相关的依赖版本

【讨论】:

回到 kafka 2.5 解决了这个问题。感谢您对 jackson-bom 的提示

以上是关于尝试在 Kafka 中创建分区时出现 NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 java 中创建 AWT 窗口时出现异常

尝试在 Keras 中创建 BLSTM 网络时出现 TypeError

尝试在 Logic 应用中创建存储帐户时出现“无效资源”消息

当我尝试在 python 中创建浏览器时出现错误

尝试在 H2 数据库中创建表时出现 Liquibase 错误

尝试在 Google App Engine 项目中创建备份时出现 404