2013-10-20 34 views
3

我正嘗試創建一個多模塊應用程序,並將其中一個模塊與其他人(從另一臺機器)分開運行。 項目結構是這樣的:玩框架:運行多模塊應用程序的單獨模塊

 main 
    / \ 

module1 module2 

我想運行一個模塊1作爲一個單獨的jar文件(?或者有這樣做的更好的方式),我會從另一臺機器上運行(我想連接它使用Akka遠程主應用程序)。

我在做什麼:

  1. 運行 「玩DIST」 命令
  2. 解壓module1.zip從通用文件夾
  3. 設置+ X模式來斌/模塊1可執行文件。
  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$ 

所以該系統一旦關閉,因爲它得到的主要方法的最後一行。如果我在沒有播放的情況下運行此代碼 - 它按預期工作,對象將被加載並等待消息,這是預期的行爲。

也許我做錯了什麼?或者我應該在module1可執行文件中設置一些選項?其他想法?

在此先感謝!

更新: 版本:

  • 斯卡拉 - 2.10.3
  • 玩! - 2.2.0
  • SBT - 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) 
+0

你能給我們SBT設置嗎?我甚至不知道Play/Scala/SBT/JDK版本以及是否所有項目都是Play項目。我認爲重現錯誤非常耗時。 – Schleichardt

+0

更新了帖子。其實,我並沒有期待有人會試圖重現這個問題,但這會非常有幫助。我希望我做錯了什麼,或者我如何在機器之間拆分應用程序的想法是錯誤的,我應該以其他方式做。以爲有人已經面臨類似的問題,並有更好的想法做這樣的事情:) – psisoyev

回答

0

所以我發現一個骯髒的解決方法,我會使用它,直到我會找到更好的解決方案。如果有人有興趣,我已經在服務器對象的底部添加以下代碼:

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鍵。髒,我同意,但沒有找到更好的解決方案。

如果會有更好的東西,我當然會將它標記爲答案。