2013-10-20 3 views
3

다중 모듈 응용 프로그램을 만들고 다른 모듈과 별도로 (다른 컴퓨터에서) 모듈 중 하나를 실행하려고합니다. 프로젝트 구조는 다음과 같습니다재생 프레임 워크 : 다중 모듈 응용 프로그램의 별도 모듈 실행

 main 
    / \ 

module1 module2 

내가 별도의 jar 파일로 모듈 1을 실행하려면 (? 또는이 일을 더 나은 방법이) 내가 다른 컴퓨터에서 실행되는가, (내가 연결할 Akka 리모팅을 사용하는 메인 앱으로).

내가 뭘하는지

:

  1. 는 빈/모듈 1 실행 파일에 보편적 폴더에서
  2. 설정 + X 모드를 명령
  3. 압축 풀기 module1.zip "DIST을 플레이"실행.
  4. (아래에 붙여 넣) 내 주요 클래스를 설정 : 외부 application.conf 파일을 실행 declare -r app_mainclass="module1.foo.Launcher"
  5. : 대신 play.core.server.NettyServer 메신저 내 주요 클래스를 넣어. 이 main 메소드의 마지막 줄에수록

    @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$ 
    

    그래서 시스템이 즉시 꺼집니다 : 여기

    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") 
    } 
    

    콘솔 출력 : 여기에

내 주요 클래스 . Play없이이 코드를 실행하면 예상대로 작동하고, 개체가로드되고 예상되는 동작 인 메시지를 기다립니다.

어쩌면 내가 뭔가 잘못하고있는 것일까 요? 아니면 module1 실행 파일에 몇 가지 옵션을 설정해야합니까? 다른 아이디어?

미리 감사드립니다.

업데이트 : 버전 :

  • 스칼라 - 2.10.3
  • 플레이! - 2.2.0
  • SBT - 0.13.0
  • Akka - 2.2.1
  • 자바 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

더러운 해결책과 내가 더 나은 해결책을 찾을 때까지 나는 그것을 사용할 것이다. 경우 누군가가 관심에서 필자는 서버 개체의 하단에이 코드를 추가했습니다 : 나는 콘솔에서 ENTER 키를 누르면됩니다 때까지

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) 

이제 시스템이 작동합니다. 더러운, 나는 동의하지만, 더 나은 해결책을 찾지 못했다.

더 나은 것이 있다면 물론 대답으로 표시 할 것입니다.

관련 문제