Я пишу java API для создания kafka производителя
У меня ошибка:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.kafka.clients.producer.ProducerConfig.(Ljava/util/Properties;)V at in.co.hadooptutorials.data.generator.cdr.kafka.main(kafka.java:65)
Ниже мой код
public class kafka {
public static void main(String[] args) throws IOException {
String TOPIC_NAME = "test";
String objec = "hello";
Properties props=new Properties();
props.put("bootstrap-server", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
ProducerConfig config = new ProducerConfig(props);
System.out.println("confing work.");
KafkaProducer<String,String> sampleProducer= new KafkaProducer<String,String>(props);
ProducerRecord<String, String> record = new ProducerRecord<String, String>(TOPIC_NAME,objec);
sampleProducer.send(record);
sampleProducer.close();
System.out.println("SimpleProducer Completed.");
}
}
Как решить эту проблему?




Здесь:
java.lang.NoSuchMethodError:
Этот всегда означает: какой-то класс хочет использовать что-то из другого класса, а во время выполнения этой другой вещи нет.
У этого всегда одна и та же основная причина: несовместимые уровни кода. Значение: вы используете libA версии n, а libA использует libB. Теперь libA требует, чтобы libB была версии
Короче говоря: посмотрите, как вы настраиваете свои зависимости. Убедитесь, что они непротиворечивы и отражают то, что kafka утверждает, что поддерживается.
Ваш код вызывает конструктор ProducerConfig:
ProducerConfig config = new ProducerConfig(props);
Во время выполнения вы видите ошибку, говорящую о том, что этот метод не существует. Конструкторы, определенные в версиях до 1.0.2, не поддерживают передачу объекта Properties. (https://github.com/apache/kafka/blob/1.0.2/clients/src/main/java/org/apache/kafka/clients/producer/ProducerConfig.java#L360-L366).
ProducerConfig(Map<?, ?> props) {
super(CONFIG, props);
}
ProducerConfig(Map<?, ?> props, boolean doLog) {
super(CONFIG, props, doLog);
}
Обратите внимание, что в версии 1.1.0 был добавлен такой конструктор: https://github.com/apache/kafka/blob/1.1.0/clients/src/main/java/org/apache/kafka/clients/producer/ProducerConfig.java#L364-L366
public ProducerConfig(Properties props) {
super(CONFIG, props);
}
Тот факт, что ваш код компилируется, говорит о том, что можно найти подходящую версию библиотеки во время компиляции. Однако во время выполнения такая подходящая версия не может быть найдена (это означает, что во время выполнения вы, вероятно, ссылаетесь на более старую версию, которая не поддерживает этот метод).
Решение будет состоять в том, чтобы проверить, какие версии библиотек Kafka вы включаете, как во время компиляции, так и во время выполнения, которые будут различаться в зависимости от того, как вы создаете свой проект (например, с помощью Maven, Gradle и т. д.).
Должно быть bootstrap.servers вместо bootstrap-server.
Всегда лучше использовать org.apache.kafka.clients.producer.ProducerConfig при настройке конфигов. например:
configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9090");
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
У вас есть правильная версия для всех библиотек?