Kafka运行异常:ClassNotFoundException: AbstractKafkaSchemaSerDe
问题分析与解决方案
错误现象
05-Jan-2023 11:19:47.532 SEVERE [http-nio-8080-exec-32] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [jpublish] in context with path [/DS] threw exception [Servlet execution threw an exception] with root cause java.lang.ClassNotFoundException:
io.confluent.kafka.serializers.AbstractKafkaSchemaSerDe
相关代码片段:
Properties props = new Properties(); props.put("bootstrap.servers", url); props.put("linger.ms", 1); props.put("max.block.ms", 10000); props.put("group.id", "group"); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaJsonSchemaSerializer.class.getName()); props.put(KafkaJsonSchemaSerializerConfig.SCHEMA_REGISTRY_URL_CONFIG, "http://localhost:8081"); Producer<String, Payment> producer = new KafkaProducer<String, Payment>(props); ProducerRecord<String, Payment> record = new ProducerRecord<String, Payment>(topic, uuid, message); producer.send(record); producer.close();
已知情况:项目已引入相关Kafka依赖,IDE中可正常导入io.confluent.kafka.serializers.AbstractKafkaSchemaSerDe类,尝试引入kafka-serde-tools依赖后问题仍存在。
可行解决方案
- 检查依赖打包范围:如果是Maven项目,确认
pom.xml中Confluent相关依赖的<scope>为compile,避免使用provided或test(这两种范围不会将依赖打包到最终部署包)。示例配置:<dependency> <groupId>io.confluent</groupId> <artifactId>kafka-json-serializer</artifactId> <version>7.3.0</version> <!-- 版本需与Kafka客户端版本匹配 --> </dependency> - 验证部署包内容:解压项目生成的WAR/JAR包,查看
BOOT-INF/lib(Spring Boot项目)或WEB-INF/lib(普通Web项目)下是否存在kafka-json-serializer-*.jar,并检查该jar内是否包含io/confluent/kafka/serializers/AbstractKafkaSchemaSerDe.class文件。若缺失,重新执行mvn clean package -DskipTests(Maven)或对应打包命令,确保依赖被正确引入。 - 统一版本兼容性:确保Confluent依赖版本与Kafka客户端版本完全匹配,版本不匹配可能导致类加载异常。比如Kafka 3.3.x对应Confluent Platform 7.3.x。
- 排查服务器类加载冲突:若部署在Tomcat等应用服务器,检查服务器全局类库中是否存在冲突的Kafka/Confluent依赖,避免应用本地依赖被服务器旧版本覆盖。可通过修改服务器配置让应用优先加载本地依赖。
- 临时替换序列化器排查:若上述方案无效,可暂时将
KafkaJsonSchemaSerializer替换为普通JsonSerializer(无需Schema Registry),验证基础Kafka生产功能是否正常:
注意:此方案仅用于排查问题,若需Schema Registry功能仍需解决类加载问题。props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class.getName());
内容的提问来源于stack exchange,提问作者blinkbink
相关产品推荐
相关产品推荐

