Play run和start有什么区别?

时间:2013-08-13 15:38:04

标签: playframework playframework-2.1

我想了解在下面的问题的上下文中运行播放开始和播放运行之间的区别。

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

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

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

但是,当我执行play run时,Tomcat无法初始化,并且X坐在那里等待响应,最终超时。

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

我意识到这是一个过于简单化的行为,但我希望从你那里得到的是导致Play运行和Play启动之间的差异,这可能会对我的应用程序的行为产生影响,导致这种失败。

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

播放输出和日志没有提供有关此问题的有用信息。

我正在使用Play 2.1.1

1 个答案:

答案 0 :(得分:11)

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

    这意味着它在播放提示符内(在SBT内,真的)运行,带有一些自定义类加载器魔法,允许自动重新加载类,自动编译模板等。这种运行应用程序的自定义方式可能是什么阻止Tomcat启动。

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

    修改:我自己并不了解血腥细节,但这一切都发生在the play run commandreloader。主人似乎是more documented,虽然我不知道2.1.x和2.2.x之间是否有变化。

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

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

但是对于实际生产,您应该使用play dist命令准备一个独立版本,然后按照in the documentation所述的包含脚本启动它。