Play 2.8.8项目通过Heroku CLI部署后服务器启动崩溃如何解决?
解决方案
1. 拿到完整根因报错
当前提供的堆栈仅为上层调用链,缺失Guice注入失败的底层异常信息。修改Procfile开启调试日志即可定位具体问题:
web: target/universal/stage/bin/bionplaydatawarehouse -Dhttp.port=${PORT} -Dlogger.root=DEBUG -Dplay.logger=DEBUG
重新部署后查看日志,即可看到具体是哪个依赖实例初始化失败、失败原因(比如缺失配置、数据库连接失败等)。
2. 补全生产环境必填配置
Play框架生产模式强制要求部分配置不能使用开发环境默认值,90%以上的同类问题都是生产配置缺失导致:
- 必填项
play.http.secret.key:在Heroku后台的Config Vars中新增该配置,或在application.conf中配置为读取环境变量play.http.secret.key = ${APP_SECRET},再到Heroku配置对应的APP_SECRET值即可。 - 数据库连接配置:如果使用Heroku的数据库附加组件,需确认
application.conf中正确读取DATABASE_URL环境变量,配置了对应JDBC驱动和连接池参数。 - 所有自定义业务配置:本地开发时硬编码的配置项,生产环境需要替换的都需要同步配置到Heroku的环境变量中。
3. 解决Guice与Java 11的兼容问题
日志中的非法反射警告是Guice 4.2.3与Java 11的兼容问题,严重时会直接导致注入失败。在Procfile的启动参数中添加JVM权限参数即可解决:
web: target/universal/stage/bin/bionplaydatawarehouse -Dhttp.port=${PORT} -J--add-opens=java.base/java.lang=ALL-UNNAMED -J--add-opens=java.base/java.lang.invoke=ALL-UNNAMED
4. 本地模拟生产环境调试
本地直接启动生产模式即可复现问题,无需反复部署到Heroku调试:
sbt dist cd target/universal unzip *.zip cd 解压生成的项目目录 bin/bionplaydatawarehouse -Dplay.http.secret.key=临时测试密钥
如果本地生产模式启动失败,可直接定位问题修复后再部署。
内容的提问来源于stack exchange,提问作者Farin
相关产品推荐
相关产品推荐

