Play framework: Запуск отдельного модуля многомодульного приложения

Я пытаюсь создать многомодульное приложение и запустить один из его модулей отдельно от других (с другой машины). Структура проекта выглядит так:

        main
       /   \

 module1   module2

Я хочу запустить модуль1 как отдельный файл jar (или есть лучший способ сделать это?), который я буду запускать с другого компьютера (я хочу подключить его к основному приложению с помощью удаленного взаимодействия Akka).

Что я делаю:

  1. Запуск команды "play dist"
  2. Распаковка module1.zip из универсальной папки
  3. Установка режима +x для исполняемого файла bin/module1.
  4. Установка моего основного класса (вставьте его ниже): вместо play.core.server.NettyServer я помещаю свой основной класс: declare -r app_mainclass="module1.foo.Launcher"
  5. Запуск с внешним файлом application.conf.

Вот мой основной класс:

class LauncherActor extends Actor {
  def receive = {
    case a => println(s"Received msg: $a ")
  }
}

object Launcher extends App {
  val system = ActorSystem("testsystem")
  val listener = system.actorOf(Props[LauncherActor], name = "listener")
  println(listener.path)
  listener ! "hi!"
  println("Server ready")
}

Вот вывод консоли:

@pavel bin$ ./module1 -Dconfig.file=/Users/pavel/projects/foobar/conf/application.conf
[WARN] [10/18/2013 18:56:03.036] [main] [EventStream(akka://testsystem)] [akka.event-handlers] config is deprecated, use [akka.loggers]
akka://testsystem/user/listener
Server ready
Received msg: hi!
@pavel bin$

Таким образом, система отключается, как только доходит до последней строки основного метода. Если я запускаю этот код без Play - он работает, как и ожидалось, объект загружается и ожидает сообщений, что является ожидаемым поведением.

Может я что-то не так делаю? Или я должен установить некоторые параметры в исполняемом файле module1? Другие идеи?

Заранее спасибо!

Обновление: Версии:

  • Скала — 2.10.3
  • Играть в! - 2.2.0
  • СБТ - 0.13.0
  • Акка — 2.2.1
  • Java 1.7 и 1.6 (пробовал обе)

Свойства сборки:

lazy val projectSettings = buildSettings ++ play.Project.playScalaSettings ++ Seq(resolvers := buildResolvers,
    libraryDependencies ++= dependencies) ++ Seq(scalacOptions += "-language:postfixOps",
    javaOptions in run ++= Seq(
      "-XX:MaxPermSize=1024m",
      "-Xmx4048m"
    ),
    Keys.fork in run := true)

  lazy val common = play.Project("common", buildVersion, dependencies, path = file("modules/common"))

  lazy val root = play.Project(appName, buildVersion, settings = projectSettings).settings(
    resolvers ++= buildResolvers
  ).dependsOn(common, module1, module2).aggregate(common, module1, module2)

  lazy val module1 = play.Project("module1", buildVersion, path = file("modules/module1")).dependsOn(common).aggregate(common)
  lazy val module2: Project = play.Project("module2", buildVersion, path = file("modules/module2")).dependsOn(common).aggregate(common)

person psisoyev    schedule 20.10.2013    source источник
comment
Можете ли вы дать нам настройки SBT? Я даже не знаю версию Play/Scala/SBT/JDK и все ли проекты являются проектами Play. Я думаю, что воспроизвести вашу ошибку занимает очень много времени.   -  person Schleichardt    schedule 21.10.2013
comment
Обновил пост. На самом деле, я не ожидал, что кто-то попытается воспроизвести проблему, но это было бы действительно полезно. Я надеялся, что я делаю что-то не так, или вся идея о том, как я разделяю приложение между машинами, неверна, и я должен сделать это как-то иначе. Думал, кто-то уже сталкивался с подобной проблемой и лучше понял, как делать такие вещи :)   -  person psisoyev    schedule 21.10.2013


Ответы (1)


Поэтому я нашел грязный обходной путь и буду использовать его, пока не найду лучшее решение. Если кому-то интересно, я добавил этот код внизу объекта Server:

val shutdown = Future {
    readLine("Press 'ENTER' key to shutdown")
  }.map { q => 
      println("**** Shutting down ****")
      System.exit(0)
  }
  import scala.concurrent.duration._
  Await.result(shutdown, 100 days)

И теперь система работает, пока я не нажму клавишу ENTER в консоли. Грязно, согласен, но лучшего решения не нашел.

Если будет что-то лучше, конечно отмечу как ответ.

person psisoyev    schedule 21.10.2013