Подтвердить что ты не робот

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, чтобы он автоматически запускался при перезапуске сервера.

Спасибо.

4b9b3361

Ответ 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, но лучше убедиться, что вы создали.