12

有没有什么方法可以结合akka 2.3和play 2.2?现在我在运行这样的应用程序时得到 AbstractMethodError 。我需要将它们都放在一个应用程序中,因为 Akka 2.3 带有非常有用的 akka 持久性模块,它非常可靠(与它的前身相反),这种可靠性在我的情况下非常重要。我已经尝试从源代码编译 play 2.2.2 并将 akka 依赖项更改为 2.3,但我仍然遇到相同的错误:

[ERROR] [04/01/2014 09:42:26.105] [play-akka.actor.default-dispatcher-6] [ActorSystem(play)] Uncaught error from thread [play-akka.actor.default-dispatcher-6] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled
 java.lang.AbstractMethodError
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
    at akka.actor.ActorCell.invoke(ActorCell.scala:487)
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
    at akka.dispatch.Mailbox.run(Mailbox.scala:220)
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
4

2 回答 2

9

Akka 2.3 和 Play 2.2 只是二进制不兼容,这意味着您可以使用 Akka 2.3 作为依赖项编译 Play 2.2,并将其发布到您的本地 ivy 或公司存储库。

在我的情况下,修补的 Play 版本没有发生 AbstractMethodError 。尝试以这种方式修补 Play:

  1. 查看标记的 Play 版本的源代码,例如https://github.com/playframework/playframework/releases/tag/2.2.2
  2. 切换到文件夹(即带有子目录framework的 sbt 项目)project
  3. 更改 Play 和 Akka 依赖的版本号,例如https://github.com/schleichardt/Play20/commit/14b45c44924ce5b3ef2159c772bc5b0544c94658
  4. sbt publishLocal或者sbt publish,对于后者,您需要调整发布{Ivy,Maven}RepositorypublishMavenStyle := trueframework/project/Build.scala
  5. (可选)除非您已将 Play 的补丁版本发布到本地 Ivy 存储库(使用publishLocal),否则您需要将解析器添加到build.sbtproject/plugins.sbt
  6. project/plugins.sbt设置修补的 Play sbt 插件中,例如,addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.2-akka-2.3.1")

演示在https://github.com/schleichardt/event-sourcing-with-the-play-framework/tree/bf171720c43a1349555726cb11cffae4d967cc4b中。修补后的 Play 版本的源代码在https://github.com/schleichardt/Play20/tree/2.2.2-akka-2.3.1中。

有关 Akka 2.3 编译 Play 的问题,另请参阅https://stackoverflow.com/a/22651261/1575096,Jeff May 无法使用 WS 库。

请记住,其他库,例如带有 Play 迭代的 ReactiveMongo,也可能依赖于 Play 库,并且可能会将未修补的版本加载到类路径中。在这种情况下,类似的东西"group" %% "library" % "version" exclude("com.typesafe.play", "play")会有所帮助。对于 ReactiveMongo,您也需要为 Akka 2.3 编译它。

sbt 'show libraryDependencies'您可以检查实际的依赖项及其版本。

于 2014-04-03T22:19:23.380 回答
6

不幸的是,您将不得不等待 Play 团队发布与 Akka 2.3 兼容的版本,或者在他们的邮件列表中询问有关如何正确构建 Play 发行版的说明(因为看起来您实际上并没有使用重新构建的罐子)。

于 2014-04-02T07:50:42.677 回答