Среда Heroku, вызывающая сбой приложения Java/Nashorn/ReactJS

Репозиторий Github https://github.com/damorton/dropwizardheroku-webgateway

Сборка ./gradlew stage

Приложение Heroku отлично работает локально, используя heroku local после этапов сборки и веб-пакета, но аварийно завершает работу в среде Heroku, поскольку приложение не может прочитать файл bundle.js, созданный на этапе сборки веб-пакета.

Выполнено

  • Зашел в приложение Heroku с помощью heroku run bash и проверил, создается ли файл bundle.js, так и есть.
  • Обновлен system.properties, чтобы использовать версию Java, аналогичную моей локальной среде java.runtime.version=1.8.0_131.

Журналы Heroku

Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will override them.
2017-05-05T10:55:43.963570+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx350m -Xss512k -Dfile.encoding=UTF-8
2017-05-05T10:55:45.617664+00:00 app[web.1]: INFO  [2017-05-05 10:55:45,613] org.eclipse.jetty.util.log: Logging initialized @1649ms
2017-05-05T10:55:45.696063+00:00 app[web.1]: INFO  [2017-05-05 10:55:45,695] io.dropwizard.server.SimpleServerFactory: Registering jersey handler with root path prefix: /
2017-05-05T10:55:45.696110+00:00 app[web.1]: INFO  [2017-05-05 10:55:45,695] io.dropwizard.server.SimpleServerFactory: Registering admin handler with root path prefix: /admin
2017-05-05T10:55:45.696230+00:00 app[web.1]: INFO  [2017-05-05 10:55:45,696] io.dropwizard.assets.AssetsBundle: Registering AssetBundle with name: assets for path /assets/*
2017-05-05T10:55:59.241010+00:00 app[web.1]: InputString in is null with path assets/js/bundle.js
2017-05-05T10:55:59.243502+00:00 app[web.1]: Exception in thread "main" java.lang.NullPointerException
2017-05-05T10:55:59.243739+00:00 app[web.1]:    at java.io.Reader.<init>(Reader.java:78)
2017-05-05T10:55:59.243867+00:00 app[web.1]:    at java.io.InputStreamReader.<init>(InputStreamReader.java:72)
2017-05-05T10:55:59.243967+00:00 app[web.1]:    at com.bitbosh.dropwizardheroku.webgateway.api.NashornController.read(NashornController.java:46)
2017-05-05T10:55:59.244023+00:00 app[web.1]:    at com.bitbosh.dropwizardheroku.webgateway.api.NashornController.<init>(NashornController.java:27)
2017-05-05T10:55:59.244096+00:00 app[web.1]:    at com.bitbosh.dropwizardheroku.webgateway.Main.run(Main.java:43)
2017-05-05T10:55:59.244149+00:00 app[web.1]:    at com.bitbosh.dropwizardheroku.webgateway.Main.run(Main.java:23)
2017-05-05T10:55:59.244212+00:00 app[web.1]:    at io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:43)
2017-05-05T10:55:59.244255+00:00 app[web.1]:    at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:85)
2017-05-05T10:55:59.244306+00:00 app[web.1]:    at io.dropwizard.cli.Cli.run(Cli.java:75)
2017-05-05T10:55:59.244391+00:00 app[web.1]:    at io.dropwizard.Application.run(Application.java:79)
2017-05-05T10:55:59.244436+00:00 app[web.1]:    at com.bitbosh.dropwizardheroku.webgateway.Main.main(Main.java:26)

Из журналов приложение выдает NullPointerException, и это вызвано тем, что механизм Nashorn в NashornController.java оценивает Reader, созданный из InputStream файла bundle.js.

Чего я не могу понять, так это почему он работает нормально локально, но падает в среде Heroku. Если я не создам файл bundle.js и не оценю исходный код Javascript, добавленный в комплект, все будет работать правильно.


person David    schedule 04.05.2017    source источник
comment
Является ли bundle.js внутри JAR? На него ссылается полный путь?   -  person codefinger    schedule 05.05.2017
comment
@codefinger Я использую dropwizard, так что да, файл bundle.js должен быть упакован в банку на этапе сборки/развертывания Heroku.   -  person David    schedule 05.05.2017
comment
@codefinger Файл bundle.js должен быть включен в слаг развертывания, поскольку он отлично работает и работает локально с использованием тех же команд. ./gradlew stage && heroku local   -  person David    schedule 05.05.2017
comment
@codefinger Использование полного пути src/main/resources/assets/js/bundle.jsвызывает ошибку, поскольку конфигурация Dropwizard зависит от инициализации пакета ресурсов с корнем каталога ресурсов в качестве параметра. Это позволяет обслуживать статические файлы из каталогов проекта, то есть assets/js/bundle.js. Это присутствует в ApplicationConfiguration.java в репо.   -  person David    schedule 08.05.2017


Ответы (1)


Проблема

Heroku будет работать ./gradlew stage, если не используется Spring Boot или Ratpack, это означает, что разработчикам необходимо указать, что происходит во время их сборки, в задаче stage, запускаемой платформой. Задачи, от которых зависит stage, не запускаются в заранее определенном порядке. Это приводит к тому, что задача webpack запускается после installDist, создавая Jar до того, как существовал bundle.js.

Решение

Определите порядок, в котором должны выполняться задачи.

task stage(dependsOn: ['installDist', 'webpack', 'npmInstall', 'clean'])
npmInstall.mustRunAfter clean
webpack.mustRunAfter npmInstall
installDist.mustRunAfter webpack

https://devcenter.heroku.com/articles/deploying-gradle-apps-on-heroku#verify-that-your-build-file-is-set-up-up-right

person David    schedule 08.05.2017