Play Framework 2 Stage Task на Windows, "Строка ввода слишком длинная"
Я пытаюсь запустить приложение 2 на Windows Server Server 2012 с помощью задачи этап" с целью обертывания этого в службе, чтобы приложение будет автоматически запускаться при перезапуске сервера. Однако при запуске приложения я получаю следующее сообщение:
The input line is too long.
The syntax of the command is incorrect.
Это связано с тем, что в Windows есть ограничение около 8000 символов для команд командной строки, но похоже, что команда этапа воспроизведения превышает это, передавая путь класса как аргумент,
Копирование папки "stage" в c:\может исправить проблему (поскольку это уменьшит размер пути к классам), но я надеялся, что будет более элегантное решение.
Кто-нибудь нашел способ обойти это? Кроме того, у людей есть предложения по запуску приложения Play в Windows, чтобы он автоматически запускался при перезапуске сервера.
Спасибо.
Ответы
Ответ 1
UPDATE: sbt native packager теперь поставляется с рядом встроенных решений, см. ниже ответ NieMaszNic.
Это известная проблема, отслеживаемая в собственном пакете SBT (который генерирует начало script) здесь:
https://github.com/sbt/sbt-native-packager/issues/72
Моя рекомендация обойти эту проблему состояла бы в том, чтобы написать собственную стартовую партию script, которая использует подстановочный шаблон для шаблона. Вы можете поместить этот script в каталог dist
в проект Play, и он будет упакован вместе с вашим приложением. То, что script может выглядеть так:
java %1 -cp "./lib/*;" play.core.server.NettyServer .
Обратите внимание, что если вы используете сопоставитель классов подстановочных знаков, вы больше не можете полагаться на упорядочение пути к классам таким же, как в режиме dev. В любом случае вы не должны полагаться на порядок классов, но люди неизбежно делают.
Ответ 2
У меня также была такая же проблема, и я не был удовлетворен предлагаемыми вами решениями.
Я нашел более простое решение.
Добавьте следующую строку в файл build.sbt
lazy val root = (project in file(".")).enablePlugins(PlayScala, LauncherJarPlugin)
Теперь, если вы создаете свое производственное приложение с помощью:
sbt dist
или запустите режим производства с помощью
sbt start
Плагин LauncherJarPlugin позаботится о создании правильных сценариев bash/пакетного запуска.
Чтобы узнать больше о LauncherJarPlugin, пожалуйста, прочитайте документацию:
Документация Sbt о длинном пути к классам
Как включить плагин в build sbt
Ответ 3
Принимая во внимание предложения Джеймса, следующее решение работает для приложения Play 2.
- CD в приложение и запустите
play clean stage
- Скопируйте [your_app]/target/universal/stage/bin/[YOUR_APP].bat в [your_app]/dist (вам может понадобиться создать "dist" ). Я переименовал файл как [your_app] _windows.bat, чтобы он прояснился, но имя не имеет большого значения. Файлы в каталоге "dist" будут скопированы с вашим приложением в следующий раз, когда вы запустите сценическую задачу (спасибо Джеймсу).
- Откройте новый файл bat в текстовом редакторе.
-
Файлы, помещенные в каталог "dist", помещаются в "универсальный" каталог (не "bin" ), поэтому вам нужно изменить домашнюю переменную, то есть удалить две полные остановки в конце, чтобы они не перемещается в родительский каталог (в строке 11 в настоящее время),
например
if "%WEB_PORTAL_HOME%"=="" set "WEB_PORTAL_HOME=%~dp0\\.."
становится:
if "%WEB_PORTAL_HOME%"=="" set "WEB_PORTAL_HOME=%~dp0"
-
Затем вам нужно изменить путь к классу в соответствии с инструкциями Джеймса, чтобы использовать подстановочный знак, а не явно перечислять все файлы 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%\\*"
- Затем вы можете запустить новый script (который скопирован в каталог [your_app]/target/stage/universal).
Важно: я рекомендовал бы повторно создавать этот файл каждый раз при обновлении
Воспроизведите на случай, если в будущем выпуски build script будут изменены.
Ответ 4
Измените самую длинную строку в файле bat:
set "APP_CLASSPATH=%APP_LIB_DIR%\..\conf\;%APP_LIB_DIR%\ *"
set "APP_MAIN_CLASS=play.core.server.ProdServerStart"
Ответ 5
Включить LauncherJarPlugin
сначала
lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean, LauncherJarPlugin)
Затем, если вы хотите только начать игру в режиме производства, вы можете использовать активатор:
activator clean compile stage testProd
или быстрая версия:
activator testProd
Это приведет к воспроизведению в режиме производства, я не уверен, что вам нужно добавить команду stage
, потому что я уверен, что она уже построена с помощью testProd
, но лучше убедиться, что вы создали.