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

时间:2014-01-29 11:07:49

标签: windows-services playframework-2.0 windows-server-2012

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

The input line is too long.
The syntax of the command is incorrect.

这是因为Windows的命令行指令有limit of around 8000个字符,但似乎Play阶段命令通过将类路径作为参数传递而超出此范围。

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

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

感谢。

5 个答案:

答案 0 :(得分:19)

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

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

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

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

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

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

答案 1 :(得分:19)

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

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

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

<button>
  <svg width="200px" height="100px">
    <polygon  points="165.083,84.769 15.971,84.769 15.971,28.227 33.742,11.263 185.114,11.263 185.114,66.837 "/>
    <text x="100" text-anchor="middle" y="55">CLICK ME</text>
  </svg>
</button>

现在,如果您使用以下命令生成生产应用程序:

lazy val root = (project in file(".")).enablePlugins(PlayScala, LauncherJarPlugin)

或使用

运行生产模式
sbt dist

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

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

Sbt documentation about long classpath

How to enable plugin in build sbt

答案 2 :(得分: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"
  • 然后,您需要根据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%\\*"
  • 然后,您可以运行新脚本(将其复制到 [your_app] / target / stage / universal 目录中)。
  

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

     

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

答案 3 :(得分:1)

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

if(jsonObject.getString("success").equals(" Welcome teste")){
      Toast.makeText(getApplicationContext(),"SUCCESS "+jsonObject.getString("success"),Toast.LENGTH_SHORT).show();
      startActivity(new Intent(getApplicationContext(),aprenderActivity.class));
}else {
      Toast.makeText(getApplicationContext(), "Error" +jsonObject.getString("error"), Toast.LENGTH_SHORT).show();
}

答案 4 :(得分:0)

首先启用LauncherJarPlugin

lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean, LauncherJarPlugin)

然后,如果您只想开始使用生产模式,您可以使用激活器:

activator clean compile stage testProd 

或快速版:

activator testProd

这将在生产模式下运行,我不确定你是否必须添加stage来命令,因为我很确定它已经用testProd建立,但它更好用确定你建立了舞台版本。