NoClassDefFoundError для встроенной кафки в проекте scala

Я пытаюсь интегрировать встроенную кафку в scala 2.11 для своих тестов. Однако я получаю следующую ошибку, которую я не мог понять.

java.lang.NoClassDefFoundError: org/apache/zookeeper/AsyncCallback$MultiCallback

Все версии библиотек kafka одинаковы. Не могли бы вы сказать, что не так в моем коде?

Вот мои зависимости

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql-kafka-0-10_2.11</artifactId>
    <version>2.4.7</version>
</dependency>
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>2.4.0</version>
</dependency>
<dependency>
    <groupId>io.github.embeddedkafka</groupId>
    <artifactId>embedded-kafka_2.11</artifactId>
    <version>2.4.0</version>
    <scope>test</scope>
</dependency>

Вот как я запускаю/останавливаю встроенный сервер kafka.

implicit val embedKafkaConfig = EmbeddedKafkaConfig(kafkaPort = 7000, zooKeeperPort = 7001)
implicit val stringDeserializer = new StringDeserializer()
implicit val stringSerializer = new StringSerializer

Before("") { _: Scenario =>
  EmbeddedKafka.start()(embedKafkaConfig)
}
After("") { _: Scenario =>
  EmbeddedKafka.stop()
}

И ошибка:

kafka.server.KafkaServer - Fatal error during KafkaServer startup. Prepare to shutdown
java.lang.NoClassDefFoundError: org/apache/zookeeper/AsyncCallback$MultiCallback
    at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1857)
    at kafka.server.KafkaServer.kafka$server$KafkaServer$$createZkClient$1(KafkaServer.scala:374)
    at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:399)
    at kafka.server.KafkaServer.startup(KafkaServer.scala:207)
    at net.manub.embeddedkafka.ops.KafkaOps$class.startKafka(kafkaOps.scala:52)
    at net.manub.embeddedkafka.EmbeddedKafka$.startKafka(EmbeddedKafka.scala:50)
    at net.manub.embeddedkafka.ops.KafkaOps$class.startKafka(kafkaOps.scala:60)
    at net.manub.embeddedkafka.EmbeddedKafka$.startKafka(EmbeddedKafka.scala:50)
    at net.manub.embeddedkafka.ops.RunningKafkaOps$class.startKafka(kafkaOps.scala:88)
    at net.manub.embeddedkafka.EmbeddedKafka$.startKafka(EmbeddedKafka.scala:50)
    at net.manub.embeddedkafka.EmbeddedKafka$.start(EmbeddedKafka.scala:68)

«Предоставленная» область означает, что она не скомпилирована в ваш код. Поэтому тесты его не найдут

OneCricketeer 26.04.2023 15:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что аналогичная проблема уже сообщалась здесь из-за некоторых конфликтующих версий между версиями зависимостей Kafk и zookeeper, о которых сообщалось в старых проблемах Apache.

https://issues.apache.org/jira/browse/BIGTOP-3208

https://github.com/apache/bigtop/pull/536

Я предлагаю вам создать дерево зависимостей и проверить совместимость версий, чтобы решить проблемы с версиями.

Спасибо за Ваш ответ. Я добавил дерево dep в свой пост. Как я могу переопределить zookeper 3.4.6 с 3.5.6 в области тестирования?

gabby 26.04.2023 15:57

@gabby Смотрите возможный ответ в конце моего ответа

Dmytro Mitin 26.04.2023 16:47

@gabby Я думаю, вы могли бы сначала проверить выпущенную версию зависимости встроенной kafka, которая содержит zookeper 3.4.6 для области тестирования. В противном случае попробуйте исключить зависимость zoo-keeper 3.5.6 от kafka-2.4.0. (Пожалуйста, посмотрите аналогичные правила исключения в примерах sbt: stackoverflow.com/questions/10958215/… ) и посмотрите, выбирает ли он старый. Я также проверил проект. github.com/embeddedkafka/embedded-kafka/blob/v2.4.0/build.sb‌​t и github.com/apache/kafka/blob/2.4.0/build.gradle

Madhawa Gunasekara 26.04.2023 16:58
Ответ принят как подходящий

Интерфейс org.apache.zookeeper.AsyncCallback.MultiCallback появился в Zookeeper 3.4.7+

https://github.com/apache/zookeeper/blob/release-3.4.7/src/java/main/org/apache/zookeeper/AsyncCallback.java#L271

Отсутствовал в Zookeeper 3.4.6-

https://github.com/apache/zookeeper/blob/release-3.4.6/src/java/main/org/apache/zookeeper/AsyncCallback.java

Судя по предоставленной вами части pom.xml, вы используете Zookeeper 3.5.6, и это должно быть нормально.

Вы должны проверить, использует ли какая-либо зависимость Zookeeper 3.4.6- в вашем реальном случае использования.


Подозреваю, что вы предоставили недостаточно информации для воспроизведения. Я не могу воспроизвести. https://scastie.scala-lang.org/DmytroMitin/q4BRo4taQAey47JufBc87w/1 (см. также вкладку «Настройки сборки»). Как создать минимальный воспроизводимый пример. Проверить себя можно следующим образом. Создайте пустой проект с вашим файлом сборки и вашим кодом. Если вы не можете воспроизвести там поведение, то и мы не сможем.

Общие причины NoClassDefFoundError:

Почему я получаю ошибку NoClassDefFoundError в Java?

Какие причины и в чем разница между NoClassDefFoundError и ClassNotFoundException?

NoClassDefFoundError может сигнализировать о несовместимости в зависимостях

Невозможно записать DF в дельта-формате на hdfs

ClassNotFoundException: breeze.storage.Zero$DoubleZero$

NoClassDefFoundError: scala/collection/TraversableOnce (использование фантомной библиотеки для извлечения данных из кластера ScyllaDB)

Как исправить внедрение зависимостей при обновлении игровой среды с 2.5.x до 2.6.x Scala


  • Вы можете сделать sbt dependencyTree. В Maven это должно быть похоже на mvn dependency:tree с maven-dependency-plugin (но в sbt это не показывает provided зависимости)

Как получить дерево зависимостей для артефакта?

  • Или напечатайте System.getProperty("java.class.path") (но это показывает путь к классам только при запуске JVM).

  • Или добавьте scalacOptions += "-Ylog-classpath" к build.sbt. В maven это должно быть похоже на <arg>-Ylog-classpath</arg>

Указание параметра времени компиляции Scalac с помощью maven-scala-plugin

  • Или запустите следующий скрипт в вашей реальной среде, которую вы используете
var cl = getClass.getClassLoader
while (cl != null) {
  println(s"classloader: ${cl.getClass.getName}")
  cl match {
    case cl: URLClassLoader =>
      println("classloader urls:")
      cl.getURLs.foreach(println)
    case _ =>
      println("not URLClassLoader")
  }
  cl = cl.getParent
}

Судя по той части дерева зависимостей, которую вы разместили, для воспроизведения достаточно было добавить

    <dependencies>
        ...
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.11</artifactId>
            <version>2.4.7</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

Как я могу переопределить zookeper 3.4.6 с 3.5.6 в области тестирования?

Попробуйте добавить в pom.xml

    <dependencies>
        ...
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.5.6</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

Как форсировать конкретную версию зависимости? (сбт)

Maven: как переопределить зависимость, добавленную библиотекой (maven)

Зачем предоставлять кучу сообщений NoClassDef, которые не имеют ничего общего с классом, упомянутым в сообщении? Breeze, Scala Collections, Play и т. д. никогда не упоминаются в вопросе.

OneCricketeer 26.04.2023 15:55

@OneCricketeer Они иллюстрируют, как я исследовал проблемы с NoClassDefFoundError в разных случаях. Причины NoClassDefFoundError могут быть разными в разных случаях. Но подходы к исследованию причин схожи. Вы согласны?

Dmytro Mitin 26.04.2023 15:59

Другие вопросы по теме