windows-services - nssm - software always up
Play Framework 2 Stage Task en Windows, “La línea de entrada es demasiado larga” (5)
Estoy tratando de reproducir la aplicación 2 en Windows Server Server 2012 usando la tarea " stage ", con el objetivo de envolver esto en un servicio para que la aplicación se ejecute automáticamente cuando se reinicie el servidor. Sin embargo, al ejecutar la aplicación recibo el siguiente mensaje:
The input line is too long.
The syntax of the command is incorrect.
Esto se debe a que Windows tiene un límite de alrededor de 8000 caracteres para las instrucciones de la línea de comandos, pero parece que el comando de la etapa Play está superando esto al pasar el classpath como un argumento.
Copiar la carpeta "stage" en c: / podría solucionar el problema (ya que reducirá el tamaño del classpath) pero esperaba que hubiera una solución más elegante.
¿Alguien ha encontrado una manera de evitar esto? Alternativamente, la gente tiene alguna sugerencia para ejecutar una aplicación Play en Windows para que se ejecute automáticamente cuando se reinicie el servidor.
Gracias.
ACTUALIZACIÓN: el empaquetador nativo sbt ahora viene con varias soluciones integradas para esto, vea la respuesta de NieMaszNic a continuación.
Este es un problema conocido, que se rastrea en el empaquetador nativo de SBT (que genera el script de inicio) aquí:
https://github.com/sbt/sbt-native-packager/issues/72
Mi recomendación para solucionar este problema sería escribir su propia secuencia de comandos de inicio por lotes que utiliza un coincidente de classpath comodín. Puede poner esta secuencia de comandos en el directorio dist
en su proyecto Play, y terminará empaquetándose con su aplicación. Ese guión podría verse así:
java %1 -cp "./lib/*;" play.core.server.NettyServer .
Tenga en cuenta que si utiliza un comodín classpath matcher, ya no puede confiar en que el orden de classpath sea el mismo que en el modo dev. No deberías confiar en el orden de clase de todos modos, pero la gente inevitablemente lo hace.
Cambia la línea más larga en tu archivo bat con:
set "APP_CLASSPATH=%APP_LIB_DIR%/../conf/;%APP_LIB_DIR%/ *"
set "APP_MAIN_CLASS=play.core.server.ProdServerStart"
Habilitar LauncherJarPlugin
primero
lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean, LauncherJarPlugin)
Entonces, si solo quieres comenzar a jugar con el modo de producción, puedes usar el activador:
activator clean compile stage testProd
o versión rápida:
activator testProd
Esto ejecutará el juego en modo de producción, no estoy seguro de si tiene que agregar el comando stage
al comando porque estoy bastante seguro de que ya se está construyendo con testProd
, pero es mejor asegurarse de que haya creado la versión del escenario.
También tuve el mismo problema y no estaba satisfecho con las soluciones que proporcionó.
He encontrado una solución más simple.
Agregue la siguiente línea al archivo build.sbt
lazy val root = (project in file(".")).enablePlugins(PlayScala, LauncherJarPlugin)
Ahora si generas tu aplicación de producción con:
sbt dist
o ejecuta un modo de producción con
sbt start
El complemento LauncherJarPlugin se encargará de generar los scripts de ejecución bash / batch adecuados.
Para obtener más información sobre LauncherJarPlugin, lea la documentación:
Teniendo en cuenta las sugerencias de James, la siguiente solución funciona para una aplicación Play 2.
- CD en la aplicación y ejecutar el
play clean stage
- Copie [your_app] / target / universal / stage / bin / [YOUR_APP] .bat a [your_app] / dist (puede que necesite crear el directorio "dist"). Cambié el nombre del archivo como [your_app] _windows.bat para que quede claro, pero el nombre realmente no importa. Los archivos en el directorio "dist" se copian a través de su aplicación la próxima vez que ejecute la tarea de escenario (gracias James).
- Abra su nuevo archivo bat en un editor de texto.
Los archivos colocados en el directorio "dist" se colocan en el directorio "universal" (no "bin"), por lo que deberá cambiar la variable de inicio, es decir, eliminar las dos paradas completas al final para que no navegue hasta el Directorio padre (en la línea 11 en la actualidad), por ejemplo
if "%WEB_PORTAL_HOME%"=="" set "WEB_PORTAL_HOME=%~dp0//.."
se convierte en:
if "%WEB_PORTAL_HOME%"=="" set "WEB_PORTAL_HOME=%~dp0"
Luego, debe cambiar la ruta de la clase, según las instrucciones de James, para usar un comodín en lugar de enumerar explícitamente todos los archivos JAR (en este momento está en la línea 91), por ejemplo
set "APP_CLASSPATH=%APP_LIB_DIR%/web-portal.web-portal-1.0-SNAPSHOT.jar;%APP_LIB_DIR%/commons-c.....
se convierte en:
set "APP_CLASSPATH=%APP_LIB_DIR%/web-portal.web-portal-1.0-SNAPSHOT.jar;%APP_LIB_DIR%//*"
- Luego puede ejecutar su nuevo script (que se copia en el directorio [your_app] / target / stage / universal ).
Importante: recomiendo volver a crear este archivo cada vez que actualice
Juega en caso de que el script de compilación cambie en futuras versiones.