【发布时间】:2013-11-22 00:08:00
【问题描述】:
我有一个用 Scala 编写的 Play 2.2 应用程序,它可以正常启动和运行(使用 play run)。然而,最近发现源文件更改后,它开始无法正确重新启动。
该应用程序用于在检测到源文件发生更改时自动重建和重新启动。 Play 仍会检测到源更改并尝试重新启动服务器,但它只会停止它 - 它没有正确重新启动。
这是play run 在控制台中的样子:
[info] Loading project definition from <path>
[info] Set current project to GTF (in build file:<path>)
--- (Running the application from SBT, auto-reloading is enabled) ---
[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
(Server started, use Ctrl+D to stop and go back to the console...)
[info] play - database [default] connected at jdbc:mysql://localhost/mydb
[info] application - START
[info] play - Starting application default Akka system.
[info] play - Application started (Dev)
到目前为止,一切都很好。此时应用程序已启动并正常运行。但是,如果我更改源文件并刷新页面,控制台中会显示以下内容:
[info] Compiling 1 Scala source to <path>...
--- (RELOAD) ---
[info] application - STOP
[info] play - Shutdown application default Akka system.
就是这样。它似乎可以编译/构建,但它永远不会到达application - START。浏览器窗口只是坐在那里永久加载页面。
我试过play clean 和play clean-all,但这并没有解决问题。我还尝试使用 tilda 运行应用程序,如下所示:play ~run (this was suggested elsewhere),但这也不起作用。有任何想法吗?同样,这非常令人费解,因为它曾经正常工作。这个问题使开发变得相当烦人,因为每次更改任何源文件时我都必须手动重新启动服务器。谢谢。
【问题讨论】:
-
我认为是您的代码记录了开始/停止。不要记录 STOP,而是尝试 new Exception().printStackTrace()。这将转储当前线程堆栈,这可能会更清楚。无论如何,我怀疑有些东西正在调用 System.exit,也许是 Akka(它喜欢在捕获异常时这样做)。可能是类加载问题。检查 logs/application.log 以查看是否更能说明问题。
-
我认为你是对的......这与 Akka 有关,因为在启动时消除我的
Akka.system.scheduler.schedule调用可以消除问题。不过,它一开始就正确启动仍然很奇怪。我无法从堆栈跟踪中获得任何特别有用的信息……日志中也没有任何内容。我会继续努力的,谢谢。 -
您可以尝试在 java.lang.System.exit 中设置一个断点来查看调用它的原因。
标签: scala playframework playframework-2.0