在Windows上玩Play Framework 2 Stage Task,"输入行太长"

Ian*_*Ian 22 windows-services playframework-2.0 windows-server-2012

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

The input line is too long.
The syntax of the command is incorrect.
Run Code Online (Sandbox Code Playgroud)

这是因为Windows 对命令行指令的限制大约为8000个字符,但似乎Play阶段命令通过将类路径作为参数传递而超出此范围.

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

有没有人找到解决这个问题的方法?或者,人们对在Windows上运行Play应用程序有任何建议,以便在服务器重新启动时自动运行.

谢谢.

Jam*_*per 19

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

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

https://github.com/sbt/sbt-native-packager/issues/72

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

java %1 -cp "./lib/*;" play.core.server.NettyServer .
Run Code Online (Sandbox Code Playgroud)

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


Nie*_*Nic 19

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

我找到了一个更简单的解决方案.

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

lazy val root = (project in file(".")).enablePlugins(PlayScala, LauncherJarPlugin)
Run Code Online (Sandbox Code Playgroud)

现在,如果您生成生产应用程序:

sbt dist
Run Code Online (Sandbox Code Playgroud)

或运行生产模式

sbt start
Run Code Online (Sandbox Code Playgroud)

LauncherJarPlugin插件将负责生成正确的bash/batch run scrips.

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

关于长类路径的Sbt文档

如何在build sbt中启用插件

  • 对于java,它是lazy val root =(项目在文件中(".")).enablePlugins(PlayJava,LauncherJarPlugin) (4认同)
  • 使用`sbt.version = 0.13.8`在`playframework-2.5`中仍然存在问题.添加`LauncherJarPlugin可以解决问题. (3认同)

Ian*_*Ian 11

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

  • CD进入应用程序并运行 play clean stage
  • 将[your_app]/target/universal/stage/bin/[YOUR_APP] .bat复制[your_app]/dist(您可能需要创建"dist"目录).我将文件重命名为[your_app] _windows.bat以使其清晰但名称并不重要.下次运行阶段任务时,"dist"目录中的文件将与您的应用程序一起复制(感谢James).
  • 在文本编辑器中打开新的bat文件.
  • 放在"dist"目录中的文件放在"通用"目录(而不是"bin")中,因此您需要更改主变量,即在末尾删除两个句点,以便它不会导航到父目录(目前在第11行),例如

    if "%WEB_PORTAL_HOME%"=="" set "WEB_PORTAL_HOME=%~dp0\\.."

变为:

if "%WEB_PORTAL_HOME%"=="" set "WEB_PORTAL_HOME=%~dp0"
Run Code Online (Sandbox Code Playgroud)
  • 然后,您需要根据James的说明更改类路径,以使用通配符而不是显式列出所有JAR文件(目前这是在第91行),例如

    set "APP_CLASSPATH=%APP_LIB_DIR%\web-portal.web-portal-1.0-SNAPSHOT.jar;%APP_LIB_DIR%\commons-c.....

变为:

set "APP_CLASSPATH=%APP_LIB_DIR%\web-portal.web-portal-1.0-SNAPSHOT.jar;%APP_LIB_DIR%\\*"
Run Code Online (Sandbox Code Playgroud)
  • 然后,您可以运行新脚本(将其复制到[your_app]/target/stage/universal目录中).

重要提示:我建议您每次升级时重新创建此文件

播放以防将来版本中的构建脚本更改.