gpt4 book ai didi

scala - 运行 Play 应用程序的 SBT 在开始使用 scala.sys.process.run 时立即退出?

转载 作者:行者123 更新时间:2023-12-04 12:52:35 27 4
gpt4 key购买 nike

我正在编写一个需要启动多个应用程序的集成测试。其中一个应用程序是作为名为 appA 的 SBT 项目的 Play one。

我可以使用 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 应用程序?有没有更好的启动方式?

最佳答案

SBT 有两种运行模式——交互式和批处理。如果您在没有任何参数的情况下运行,它将进入交互模式并且不会退出。当您通过传递命令运行它时,它以批处理模式运行,并在最后一个命令完成时退出。您在 SBT 中的应用程序是否在 fork 的 JVM 中运行并不重要。

因此,要“修复”它,您可以应用此 hack:添加 ~命令到 sbt 命令/参数列表的末尾:

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

~用于观察源代码的变化并在发生变化时重新编译。因此 SBT 永远不会退出,除非被用户停止或杀死。

一种更简洁的方法是在 Jetty 容器中运行 Play 应用程序(假设您要运行 WAR),或者通过调用一个主类来启动 Jetty,使用类似 java com.example.MyMain 的命令但这需要额外的设置。

关于scala - 运行 Play 应用程序的 SBT 在开始使用 scala.sys.process.run 时立即退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22085385/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com