scala - Play Framework : Running separate module of multi-module application

标签 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 文件运行。

这是我的主要类(class):

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 可执行文件中设置一些选项?还有其他想法吗?

提前致谢!

更新: 版本:

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

最佳答案

所以我找到了一个肮脏的解决方法,我将使用它,直到找到更好的解决方案。如果有人感兴趣,我在服务器对象的底部添加了以下代码:

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 键。肮脏,我同意,但没有找到更好的解决方案。

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

关于scala - Play Framework : Running separate module of multi-module application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19482018/

相关文章:

web-services - 为 2.5.x 独立 Play WS

SBT 没有找到 Scalatest 2.10.1

angularjs - 为什么我应该在我的 sbt playframework 项目中使用前端插件?

json - 在 Play2 scala 应用程序中执行 json 读取和写入时如何排除值

reflection - 斯卡拉反射: getDeclaringTrait?

java - 玩2.4,报错: package play. *不存在

scala - 执行 Lift 项目时使用 SBT 出现内存不足错误

scala - Some(Array(Array(Array(String)))) 到 Array(String) 的转换/扁平化

scala - 更改 block lambda 的 Scala 自动格式化样式

使用 Play Framework 在 Heroku 中访问数据库时间