7

在以下问题的背景下,我想了解运行 play start 和 play run 之间的区别。

我的具体用例相当复杂,但我会像这样简化它:

  • 在启动时(作为 Global.scala 的一部分),我的 Play 应用程序正在对 Java 应用程序 X 的入口点进行直接方法调用。
  • 作为其初始化的一部分,X 启动 Tomcat 的嵌入式实例。
  • 在 X 的初始化结束时,它会验证 Tomcat 是否已启动并响应请求。

现在,当我play start在这个应用程序上运行时,Tomcat 启动并运行,X 很开心,生活还在继续。

但是,当我这样做时play run,Tomcat 无法初始化,X 坐在那里等待响应,最终超时。

我需要使用的主要原因play run是用于开发,因为我想附加 Eclipse 调试器以通过运行play debug run.

我意识到这是一种过度简化,但我希望从您那里得到的是导致 Play run 和 Play start 之间的差异,这可能会影响我的应用程序的行为,从而导致此失败。

现在,我尝试在http://www.playframework.com/documentation/2.1.x/ThreadPools之后增加 Play 的默认线程池中的线程数,但没有运气。

播放输出和日志没有给我关于这个问题的有用信息。

我正在使用 Play 2.1.1

4

1 回答 1

11
  • play run在开发模式下启动播放应用程序。

    这意味着它在播放提示中运行(实际上是在 SBT 中),具有一些自定义类加载器的魔法,以允许自动重新加载类、自动编译模板等。这种运行应用程序的自定义方式可能会阻止 Tomcat开始。

    如果没有来自 Tomcat 的一些日志输出或堆栈跟踪,很难说更多关于 Tomcat 不启动的原因。这有点类似于在另一个容器中启动 Tomcat,该容器通过自定义类加载器(如 Tomcat)提供隔离。

    编辑:我自己不知道血淋淋的细节,但这一切都发生在play run 命令reloader中。虽然我不知道 2.1.x 和 2.2.x 之间是否发生了变化,但它似乎在 master 中有更多记录。

  • play start是一种在生产模式下运行应用程序的交互方式。

    这意味着它与对 的调用完全相同java -cp [...] YourMainClass,只是它从播放提示(需要Ctrl+D分离)交互运行,而不是在后台运行(因此它不适合自动部署)。

但是对于实际生产,您应该使用命令准备一个独立版本,play dist然后按照文档中的说明使用包含的脚本启动它。

于 2013-08-13T16:19:23.370 回答