如何在Akka 2.3.x上运行Play 2.2.x? [英] How to run Play 2.2.x with Akka 2.3.x?

查看:125
本文介绍了如何在Akka 2.3.x上运行Play 2.2.x?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Is there any way to combine akka 2.3 and play 2.2? For now I'm getting AbstractMethodError while running such application. I need to have them both in one app because Akka 2.3 comes with very useful akka persistence module which is very reliable(in opposition to it's predecessor) and such reliability is really important in my case. I've tried compiling play 2.2.2 from sources and changing akka dependency there to 2.3 but i still get the same error:

[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)

推荐答案

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

Akka 2.3 and Play 2.2 are just binary incompatible that means that you can compile Play 2.2 with Akka 2.3 as dependency and publish it to your local ivy or company repository.

在我的情况下,修补的Play版本未发生AbstractMethodError.尝试通过以下方式打补丁:

In my case no AbstractMethodError occurred with the patched Play version. Try to patch Play this way:

  1. 签出带标签的Play版本的源代码,例如 https://github.com/playframework/playframework/releases/tag/2.2.2
  2. 切换到framework文件夹(这是带有project子目录的sbt项目)
  3. 更改Play和Akka依赖项的版本号,例如 https://github.com /schleichardt/Play20/commit/14b45c44924ce5b3ef2159c772bc5b0544c94658
  4. sbt publishLocalsbt publish,对于后者,您需要调整framework/project/Build.scala
  5. 中的发布{Ivy,Maven}存储库和publishMavenStyle := true
  6. (可选),除非您已将Play的修补程序版本发布到本地Ivy存储库(使用publishLocal),否则需要在build.sbtproject/plugins.sbt
  7. 中添加一个解析程序.
  8. project/plugins.sbt中设置修补的Play sbt插件,例如addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.2-akka-2.3.1")
  1. Checkout the source code of a tagged Play version, e.g., https://github.com/playframework/playframework/releases/tag/2.2.2
  2. Switch into the framework folder (that's the sbt project with the project subdirectory)
  3. Change the version number of Play and Akka dependency, e.g., https://github.com/schleichardt/Play20/commit/14b45c44924ce5b3ef2159c772bc5b0544c94658
  4. sbt publishLocal or sbt publish, for the latter you need to adjust publishing{Ivy,Maven}Repository and publishMavenStyle := true in framework/project/Build.scala
  5. (optional) Unless you've published the patch version of Play to your local Ivy repository (using publishLocal), you need to add a resolver to build.sbt and project/plugins.sbt
  6. In project/plugins.sbt set the patched Play sbt plugin, e.g., addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.2-akka-2.3.1")

一个演示位于 https://github .com/schleichardt/event-sourcing-with-play-framework/tree/bf171720c43a1349555726cb11cffae4d967cc4b .修补后的Play版本的源代码位于 https://github.com/schleichardt/Play20/tree/2.2.2-akka-2.3.1 .

A demo is in https://github.com/schleichardt/event-sourcing-with-the-play-framework/tree/bf171720c43a1349555726cb11cffae4d967cc4b. The source code for the patched Play version is in https://github.com/schleichardt/Play20/tree/2.2.2-akka-2.3.1.

有关编译的Akka 2.3的问题,也请参考 https://stackoverflow.com/a/22651261/1575096 播放,Jeff May无法使用WS库.

Refer also to https://stackoverflow.com/a/22651261/1575096 for problems with an Akka 2.3 compiled Play, Jeff May was not able to use the WS library.

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

Keep in mind that other libraries, for example ReactiveMongo with Play iteratees, may also depend on Play libraries and may load the unpatched version into the class path. In that case something like "group" %% "library" % "version" exclude("com.typesafe.play", "play") would help. In case of ReactiveMongo you need to compile it for Akka 2.3, too.

使用sbt 'show libraryDependencies',您可以检查实际的依赖关系及其版本.

With sbt 'show libraryDependencies' you can inspect the actual dependencies and their versions.

这篇关于如何在Akka 2.3.x上运行Play 2.2.x?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆