2014-02-28 30 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

相关问题