Windows services “在Windows上播放框架2阶段任务”;“输入行太长”;

Windows services “在Windows上播放框架2阶段任务”;“输入行太长”;,windows-services,playframework-2.0,windows-server-2012,Windows Services,Playframework 2.0,Windows Server 2012,我正在尝试使用“”任务在Windows Server 2012上播放2应用程序,目标是将其包装到服务中,以便在服务器重新启动时应用程序将自动运行。但是,运行应用程序时,我收到以下消息: The input line is too long. The syntax of the command is incorrect. 这是因为Windows有一个用于命令行指令的字符,但Play stage命令似乎通过将类路径作为参数传递而超过了这个字符 将“stage”文件夹复制到c:\可能会解决这个问题(

我正在尝试使用“”任务在Windows Server 2012上播放2应用程序,目标是将其包装到服务中,以便在服务器重新启动时应用程序将自动运行。但是,运行应用程序时,我收到以下消息:

The input line is too long.
The syntax of the command is incorrect.
这是因为Windows有一个用于命令行指令的字符,但Play stage命令似乎通过将类路径作为参数传递而超过了这个字符

将“stage”文件夹复制到c:\可能会解决这个问题(因为它会减少类路径的大小),但我希望会有一个更优雅的解决方案

有人找到办法解决这个问题吗?另外,人们对在Windows上运行Play应用程序是否有任何建议,以便在服务器重新启动时自动运行


谢谢。

更新:sbt native packager现在提供了许多内置解决方案,请参见下面的NieMaszNic的答案

这是一个已知问题,在SBT本机打包程序(生成启动脚本)中进行跟踪,如下所示:

我建议您编写自己的使用通配符类路径匹配器的开始批处理脚本来解决这个问题。您可以将此脚本放在Play项目的
dist
目录中,它最终将与您的应用程序打包在一起。该脚本可能如下所示:

java %1 -cp "./lib/*;" play.core.server.NettyServer .

请注意,如果使用通配符类路径匹配器,则不能再依赖于类路径顺序与开发模式中的相同。无论如何,您不应该依赖于类路径排序,但人们不可避免地会这样做。

考虑到James的建议,下面的解决方案适用于Play 2应用程序

  • 将CD放入应用程序并运行
    play clean stage

  • 复制[你的应用程序]/target/universal/stage/bin/[你的应用程序].bat[你的应用程序]/dist(你可能需要创建“dist”目录)。我将该文件重命名为[your_app]\u windows.bat,以明确说明问题,但名称并不重要。下次运行stage任务时,“dist”目录中的文件会随应用程序一起复制(谢谢James)

  • 在文本编辑器中打开新的bat文件

  • 放在“dist”目录中的文件放在“universal”目录(而不是“bin”)中,因此您需要更改home变量,即删除末尾的两个句号,这样它就不会导航到父目录(目前在第11行), e、 g

    如果“%WEB\u PORTAL\u HOME%”==“设置”WEB\u PORTAL\u HOME=%~dp0\\…”

变成:

if "%WEB_PORTAL_HOME%"=="" set "WEB_PORTAL_HOME=%~dp0"
set "APP_CLASSPATH=%APP_LIB_DIR%\web-portal.web-portal-1.0-SNAPSHOT.jar;%APP_LIB_DIR%\\*"
  • 然后,根据James的说明,您需要更改类路径,以使用通配符,而不是显式列出所有JAR文件(目前在第91行) e、 g

    set“APP\u CLASSPATH=%APP\u LIB\u DIR%\web portal.web-portal-1.0-SNAPSHOT.jar;%APP\u LIB\u DIR%\commons-c…..

变成:

if "%WEB_PORTAL_HOME%"=="" set "WEB_PORTAL_HOME=%~dp0"
set "APP_CLASSPATH=%APP_LIB_DIR%\web-portal.web-portal-1.0-SNAPSHOT.jar;%APP_LIB_DIR%\\*"
  • 然后,您可以运行新脚本(复制到[your_app]/target/stage/universal目录中)
重要提示:我建议每次升级时重新创建此文件

以防构建脚本在将来的版本中发生更改


我也有同样的问题,我对你提供的解决方案不满意

我找到了一个更简单的解决办法

将以下行添加到build.sbt文件中

lazy val root = (project in file(".")).enablePlugins(PlayScala, LauncherJarPlugin)
现在,如果您使用以下工具生成生产应用程序:

sbt dist
或者运行一种生产模式

sbt start
LauncherJarPlugin插件将负责生成正确的bash/批处理运行脚本

要了解有关LauncherJarPlugin的更多信息,请阅读文档:


首先启用
插件

lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean, LauncherJarPlugin)
然后,如果您只想开始使用生产模式,您可以使用activator:

activator clean compile stage testProd 
或快速版本:

activator testProd

这将在生产模式下运行play,我不确定您是否必须将
stage
添加到命令中,因为我非常确定它已经使用
testProd
构建,但最好确保您构建了stage版本。

使用以下命令更改bat文件中的最长行:

set "APP_CLASSPATH=%APP_LIB_DIR%\..\conf\;%APP_LIB_DIR%\*"
就在之前

set "APP_MAIN_CLASS=play.core.server.ProdServerStart"

这很好。我将创建一个单独的答案,专门解释如何使用Play 2应用程序实现此功能。感谢您的帮助。我收到的错误如下错误:无法找到或加载主类Play.core.server.NettyServerplus,原因是懒惰:)对于java,它是懒惰的val root=(文件中的项目(“.”)。enablePlugins(PlayJava,插件)
playframework-2.5
sbt.version=0.13.8
仍有问题。添加'launcherplugin'修复了问题。谢谢。您节省了我的时间。请确保删除该行,而不是像我那样在它前面用
rem
注释。问题仍然存在于
playframework-2.5
中。注意
%a之间的空格PP_LIB_DIR%\和*
。它应该是
%APP_LIB_DIR%\*
,即没有空间