2014-02-28 61 views
1

我在寫一個集成測試,需要啓動幾個應用程序。其中一個應用是作爲SBT項目播放一個名爲appA開始使用scala.sys.process.run時SBT運行Play應用程序立即退出?

我能夠開始使用scala.sys.process如下正確的端口上的應用:

import scala.sys.process._ 
import org.scalatest._ 

class Main extends FeatureSpec with Matchers{ 
    val app = Seq("sbt", "project appA", "run 7777").run 
    println(app.exitValue) 
} 

衍生的應用然而,隨着返回值0立即退出。沒有錯誤顯示給控制檯。我剛纔看到:

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:3000 

(Server started, use Ctrl+D to stop and go back to the console...) 


[success] Total time: 1 s, completed Feb 27, 2014 10:26:56 PM 
0 

的0在輸出的到底是從調用創建的過程exitValueexitValue阻塞,直到產生的進程退出。

如何在不立即退出的情況下運行Play應用程序?有沒有更好的方法來啓動應用程序?

+0

當它運行sbt時是否打印任何錯誤? –

+0

@AlekseyIzmailov不,沒有錯誤。我編輯了這個問題來表明這一點。 – mushroom

回答

4

SBT有2種運行模式 - 交互式和批處理。如果你運行時沒有任何參數,它會進入交互模式並且不會退出。當您通過傳遞命令運行它時,它將以批處理模式運行,並在最後一條命令完成時退出。無論您的應用程序在SBT內是否運行在分叉的JVM中,都無關緊要。

因此,要「修理」它,你可以將這個技巧:添加~命令SBT命令/ args來列表的末尾:

val app = Seq("sbt", "project appA", "run 7777", "~").run 

~用於監視更改源代碼,並重新編譯時它發生。因此SBT將永遠不會退出,除非用戶停止或被殺死。

一個更簡潔的方法是在Jetty容器中運行Play應用程序(假設您有WAR運行)或者通過調用啓動Jetty的主類來使用像java com.example.MyMain這樣的命令,但這需要額外的設置。

+0

謝謝你的回答。黑客確實解決了關閉問題。即使這個過程不會退出,直到我殺了它,遊戲應用程序本身仍然因爲某種原因立即退出。有關如何阻止此事的任何想法?我寧願不創建一個jar或war,只是像往常一樣運行應用程序。 – mushroom

+0

@mushroom爲我的Web應用程序保持運行。也許它與你如何運行它以及它是什麼類型的應用程序有關。這將有助於查看您的Boot或Main類。 –

+1

對我來說,將命令從「運行」更改爲「啓動」使得該應用程序不再退出。我不知道這會有什麼不同。我最終創建了一個jar,並以這種方式開始。接受你的答案。 – mushroom

相關問題