Ошибка зависимости времени выполнения MongoDB Reactive Streams с Alpakka Mongo Connector ClassNotFoundException

Я пытаюсь интегрировать Alpakka Mongo Connector в приложение, которое сильно зависит от библиотек Akka для потоковой обработки. Приложение также использует Akka HTTP.
Я столкнулся с проблемой зависимости во время выполнения. В частности, я получаю NoClassDefFoundError для некоторых оболочек Success/Failure, когда пытаюсь использовать метод MongoSink.insertOne, предоставленный коннектором Mongo. Полная трассировка стека:

java.lang.NoClassDefFoundError: com/mongodb/reactivestreams/client/Success
    at akka.stream.alpakka.mongodb.scaladsl.MongoFlow$.$anonfun$insertOne$1(MongoFlow.scala:44)
    at akka.stream.impl.fusing.Map$$anon$1.onPush(Ops.scala:53)
    at akka.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:541)
    at akka.stream.impl.fusing.GraphInterpreter.execute(GraphInterpreter.scala:423)
    at akka.stream.impl.fusing.GraphInterpreterShell.runBatch(ActorGraphInterpreter.scala:625)
    at akka.stream.impl.fusing.ActorGraphInterpreter$SimpleBoundaryEvent.execute(ActorGraphInterpreter.scala:56)
    at akka.stream.impl.fusing.ActorGraphInterpreter$SimpleBoundaryEvent.execute$(ActorGraphInterpreter.scala:52)
    at akka.stream.impl.fusing.ActorGraphInterpreter$BatchingActorInputBoundary$OnNext.execute(ActorGraphInterpreter.scala:95)
    at akka.stream.impl.fusing.GraphInterpreterShell.processEvent(ActorGraphInterpreter.scala:600)
    at akka.stream.impl.fusing.ActorGraphInterpreter.akka$stream$impl$fusing$ActorGraphInterpreter$$processEvent(ActorGraphInterpreter.scala:769)
    at akka.stream.impl.fusing.ActorGraphInterpreter$$anonfun$receive$1.applyOrElse(ActorGraphInterpreter.scala:784)
    at akka.actor.Actor.aroundReceive(Actor.scala:537)
    at akka.actor.Actor.aroundReceive$(Actor.scala:535)
    at akka.stream.impl.fusing.ActorGraphInterpreter.aroundReceive(ActorGraphInterpreter.scala:691)
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:577)
    at akka.actor.ActorCell.invoke(ActorCell.scala:547)
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:270)
    at akka.dispatch.Mailbox.run(Mailbox.scala:231)
    at akka.dispatch.Mailbox.exec(Mailbox.scala:243)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
Caused by: java.lang.ClassNotFoundException: com.mongodb.reactivestreams.client.Success
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 24 more

Зависимости:

val akkaHttpVersion = "10.2.1"
val akkaVersion = "2.6.10"
val scalaTestVersion = "3.2.0"
val scalaHtmlScraperVersion = "2.2.0"
val loggerVersion = "1.2.3"
val alpakkaMongoVersion = "2.0.2"

libraryDependencies ++= Seq(
  "org.mongodb.scala" %% "mongo-scala-driver" % "4.1.1",
  "com.typesafe.akka" %% "akka-stream-typed" % akkaVersion,    
  "com.typesafe.akka" %% "akka-http" % akkaHttpVersion,
  "com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpVersion,
  "com.lightbend.akka" %% "akka-stream-alpakka-mongodb" % "2.0.2",
  "ch.qos.logback" % "logback-classic" % loggerVersion,
  "org.scalactic" %% "scalactic" % scalaTestVersion,
  "org.scalatest" %% "scalatest" % scalaTestVersion,
 )

Я также пытался добавить зависимость org.mongodb:mongodb-driver-reactivestreams:4.1.1, но по какой-то причине com.mongodb.reactivestreams.client.Success не является частью двоичного файла. Я тоже пробовал разные версии. Некоторая помощь определенно будет оценена по достоинству. Я использую Скала 2.13.3


person ubiquitousbyte    schedule 30.12.2020    source источник
comment
Следует отметить, что Alpakka 3.0 обновит эту зависимость.   -  person Levi Ramsey    schedule 15.01.2021


Ответы (1)


Ваша проблема связана с драйвером Mongo Reactive Streams. Версия, которую использует Alpakka, немного устарела (13 августа 2019 г.). См. документ Alpakka в разделе прямых зависимостей:

org.mongodb mongodb-драйвер-реактивные потоки 1.12.0

В этой банке вы можете найти класс Success:

введите здесь описание изображения

person Emiliano Martinez    schedule 30.12.2020
comment
Я действительно видел это и добавил точную зависимость, которую вы только что указали. Однако, немного покопавшись, я обнаружил, что наличие org.mongodb.scala: mongo-scala-driver 4.1.1 перезаписало версию реактивных потоков с 1.12.0 на 4.1.1. После понижения версии моего драйвера scala до версии 2.7.0 и добавления упомянутой вами зависимости моя проблема была решена. Спасибо за ваше время. Вывод: Альпакке стоит обновить свои коннекторы. - person ubiquitousbyte; 31.12.2020