Акка-персистентность с Play Framework

Я настроил проект Play Framework и хочу использовать akka-persistence вместе с ним. Я скачал JAR для akka-persistence и поместил его в папку lib моего проекта Play. Классы akka-persistence распознаются, и я могу скомпилировать и запустить приложение, но как только приложение запускается, оно выдает NoClassDefFoundError исключение и приложение останавливается. Я успешно использовал akka-persistence ранее (хотя не с проектом Play Framework). Есть намеки?

Примечания: я использую Play Framework 2.3.4 (который, как мне кажется, использует Akka 2.3.4 с удаленным модулем akka-persistence). Я использую Java все вокруг (не Scala). Баночка для акка-персистентности: акка-персистент-экспериментальная_2.11-2.3.4.jar. Выдается исключение и трассировка стека выглядит следующим образом:

[info] play - Application started (Dev)
[info] play - Starting application default Akka system.
Uncaught error from thread [application-akka.persistence.dispatchers.default-plugin-dispatcher-7] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[application]
java.lang.NoClassDefFoundError: org/iq80/leveldb/DBFactory
    at akka.persistence.journal.leveldb.LeveldbJournal.<init>(LeveldbJournal.scala:20)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at java.lang.Class.newInstance(Class.java:379)
    at akka.util.Reflect$.instantiate(Reflect.scala:45)
    at akka.actor.NoArgsReflectConstructor.produce(Props.scala:361)
    at akka.actor.Props.newActor(Props.scala:252)
    at akka.actor.ActorCell.newActor(ActorCell.scala:552)
    at akka.actor.ActorCell.create(ActorCell.scala:578)
    at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:456)
    at akka.actor.ActorCell.systemInvoke(ActorCell.scala:478)
    at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:263)
    at akka.dispatch.Mailbox.run(Mailbox.scala:219)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.iq80.leveldb.DBFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 18 more
[ERROR] [12/16/2014 20:56:12.495] [application-akka.persistence.dispatchers.default-plugin-dispatcher-7] [ActorSystem(application)] Uncaught error from thread [application-akka.persistence.dispatchers.default-plugin-dispatcher-7] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled
java.lang.NoClassDefFoundError: org/iq80/leveldb/DBFactory
    at akka.persistence.journal.leveldb.LeveldbJournal.<init>(LeveldbJournal.scala:20)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at java.lang.Class.newInstance(Class.java:379)
    at akka.util.Reflect$.instantiate(Reflect.scala:45)
    at akka.actor.NoArgsReflectConstructor.produce(Props.scala:361)
    at akka.actor.Props.newActor(Props.scala:252)
    at akka.actor.ActorCell.newActor(ActorCell.scala:552)
    at akka.actor.ActorCell.create(ActorCell.scala:578)
    at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:456)
    at akka.actor.ActorCell.systemInvoke(ActorCell.scala:478)
    at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:263)
    at akka.dispatch.Mailbox.run(Mailbox.scala:219)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.iq80.leveldb.DBFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 18 more

Мой build.sbt:

name := """project-name"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayJava)

scalaVersion := "2.11.1"

libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-persistence-experimental" % "2.3.4",
  "org.iq80.leveldb" % "leveldb" % "0.7", // I added this
  "org.fusesource.leveldbjni" % "leveldbjni-all" % "1.8", // and this, because of the jar
  "org.scalatest" %% "scalatest" % "2.1.6" % "test",
  "com.amazonaws" % "aws-java-sdk-dynamodb" % "1.9.5"
)

libraryDependencies ++= Seq(
  javaJdbc,
  javaEbean,
  cache,
  javaWs
)

2 ответа

Решение

Это потому, что вы пропускаете другие переходные зависимости, которые akka-persistence зависит от. Например, по умолчанию это зависит от:

  • org.fusesource.leveldbjni:leveldbjni-all:1.7
  • org.iq80.leveldb:leveldb:0.5
  • com.google.protobuf:protobuf-java:2.5.0

И все это имеет дополнительные зависимости. Вместо того, чтобы скачивать / добавлять банки вручную, вы должны добавить akka-persistence в libraryDependencies в вашем build.sbt который автоматически вытянет все необходимые зависимости.

libraryDependencies += "com.typesafe.akka" %% "akka-persistence-experimental" % "2.3.4"

Ну, текущее решение, которое я нашел, - это добавление этих двух зависимостей в build.sbt:

  "org.iq80.leveldb" % "leveldb" % "0.7"

  "org.fusesource.leveldbjni" % "leveldbjni-all" % "1.8"

Тем не менее, я был бы очень рад услышать, почему такая вещь решает проблему и если она хорошо документирована где-то в Интернете.

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