Play框架:运行多模块应用程序的独立模块

时间:2013-10-20 19:45:47

标签: scala playframework sbt akka multi-module

我正在尝试创建一个多模块应用程序,并将其中一个模块与其他模块(从另一台机器)分开运行。 项目结构如下所示:

        main
       /   \

 module1   module2

我想将module1作为一个单独的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文件运行。
  6. 这是我的主要课程:

    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$
    

    因此系统一旦到达main方法的最后一行就会关闭。如果我在没有Play的情况下运行此代码 - 它按预期工作,对象被加载并等待消息,这是预期的行为。

    也许我做错了什么?或者我应该在module1可执行文件中设置一些选项?其他想法?

    提前致谢!

    更新: 版本:

    • Scala - 2.10.3
    • 播放! - 2.2.0
    • SBT - 0.13.0
    • Akka - 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)
    

1 个答案:

答案 0 :(得分:0)

所以我找到了一个肮脏的解决方法,我将使用它直到找到更好的解决方案。如果有人感兴趣,我已在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键。肮脏,我同意,但没有找到更好的解决方案。

如果有更好的东西,我当然会将其标记为答案。