【问题标题】:akka-persistence with Play Framework使用 Play 框架的 akka 持久性
【发布时间】:2015-02-15 03:31:14
【问题描述】:

我已经设置了一个Play Framework 项目,我想将akka-persistence 与它一起使用。我下载了用于 akka-persistence 的 JAR 并将其放在我的 Play 项目的 lib 文件夹中。 akka-persistence 类被识别,我可以编译和运行应用程序,但是一旦应用程序启动,它就会抛出 NoClassDefFoundError 异常并且应用程序停止。我之前已经成功使用过 akka-persistence(尽管没有使用 Play Framework 项目)。有什么提示吗?

注意事项:我正在使用 Play Framework 2.3.4(我相信它使用 Akka 2.3.4,并手动删除了 akka-persistence 模块)。我到处都在使用Java(不是Scala)。 akka-persistence 的 jar 是 akka-persistence-experimental_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
)

【问题讨论】:

    标签: java playframework sbt akka akka-persistence


    【解决方案1】:

    这是因为您缺少 akka-persistence 所依赖的其他临时依赖项。例如,默认情况下它取决于:

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

    所有这些都有进一步的依赖关系。您应该在 build.sbt 中添加 akka-persistencelibraryDependencies 而不是手动下载/添加 jar,这将自动引入所有必需的依赖项。

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

    【讨论】:

    • 嗯,谢谢你的回答。我手动添加 jar 的原因正是将其添加到 build.sbt 中不起作用(而其他依赖项在 build.sbt 中按预期工作)
    • 你说它不起作用是什么意思?你得到什么样的错误?你需要确保你没有打错任何字。
    • 我什至复制了您发布的行来尝试。当我说它不起作用时,我的意思是:1)我写了对 build.sbt 的依赖。 2) sbt 更新了项目 3) 我可以访问我在 build.sbt 中的其他库中的其他类,但不能访问来自 akka-persistence 的类。我会将我的 build.sbt 附加到问题中。感谢您的帮助。
    • 尝试从libraryDependencies 中删除leveldbleveldbjni-all,因为它们可能不是akka-persistence 所依赖的。
    • 一开始就是这样,我知道 UntypedPersistentActor 不存在(通常整个 akka-persistence 内容都无法访问)。
    【解决方案2】:

    嗯,我找到的当前解决方案是将这两个依赖项添加到 build.sbt:

      "org.iq80.leveldb" % "leveldb" % "0.7"
    
      "org.fusesource.leveldbjni" % "leveldbjni-all" % "1.8"
    

    尽管如此,我很高兴听到为什么这样的东西可以解决问题,以及它是否在网络上的某个地方得到了很好的记录。

    【讨论】:

      猜你喜欢
      • 2015-03-26
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2019-02-10
      • 2011-07-03
      • 1970-01-01
      相关资源
      最近更新 更多