Как запустить Play 2.2.x с помощью Akka 2.3.x?

Есть ли способ объединить akka 2.3 и играть 2.2? На данный момент я получаю AbstractMethodError при запуске такого приложения. Мне нужно иметь их как в одном приложении, так как Akka 2.3 поставляется с очень полезным модулем постоянной акки, который является очень надежным (в противовес ему предшественником), и такая надежность действительно важна в моем случае. Я попытался скомпилировать игру 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)

Ответ 1

Akka 2.3 и Play 2.2 являются просто двоичными, несовместимыми, что означает, что вы можете скомпилировать Play 2.2 с Akka 2.3 в качестве зависимости и опубликовать его в своем местном репозитории плюща или компании.

В моем случае не было отмечено AbstractMethodError с исправленной версией Play. Попробуйте установить этот способ:

  • Оформить исходный код помеченной версии воспроизведения, например https://github.com/playframework/playframework/releases/tag/2.2.2
  • Переключитесь в папку framework (проект sbt с подкаталогом project)
  • Измените номер версии зависимости Play и Akka, например https://github.com/schleichardt/Play20/commit/14b45c44924ce5b3ef2159c772bc5b0544c94658
  • sbt publishLocal или sbt publish, для последнего вам необходимо настроить публикацию {Ivy, Maven} репозитория и publishMavenStyle := true в framework/project/Build.scala
  • (необязательно) Если вы не опубликовали версию патча Play в локальный репозиторий Ivy (используя publishLocal), вам нужно добавить преобразователь в build.sbt и project/plugins.sbt
  • В 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.

Обратите внимание также на fooobar.com/questions/449408/... на проблемы с компилятором Akka 2.3, Jeff May не смог использовать библиотеку WS.

Имейте в виду, что другие библиотеки, например ReactiveMongo with Play iteratees, также могут зависеть от библиотек Play и могут загружать непересекаемую версию в путь класса. В этом случае поможет что-то вроде "group" %% "library" % "version" exclude("com.typesafe.play", "play"). В случае ReactiveMongo вам также необходимо скомпилировать его для Akka 2.3.

С помощью sbt 'show libraryDependencies' вы можете проверить фактические зависимости и их версии.

Ответ 2

К сожалению, вам придется подождать, пока команда Play опубликует выпуск, совместимый с Akka 2.3, или попросит в своем списке рассылки о том, как правильно создать дистрибутив Play (так как кажется, что вы фактически не использовали свой перестроенные JAR).