Heroku部署Java Maven应用:Dyno始终处于OFF状态求助
排查Heroku上Discord Bot Dyno始终OFF的问题
嘿,我来帮你一步步揪出问题所在!从你的描述来看,构建成功但dyno一直处于关闭状态,大概率是这几个原因导致的:
1. 错误使用了web类型的Dyno(最可能的核心原因)
你的应用是Discord机器人,不需要监听HTTP端口,但Heroku的web类型dyno会强制做端口健康检查——如果你的Bot没有绑定$PORT并监听HTTP请求,Heroku会判定启动失败,直接关掉dyno,最终显示OFF状态。
解决办法:
- 把maven插件里的
processTypes改成worker类型(worker类型不需要端口检查):<processTypes> <worker>java $JAVA_OPTS -cp target/classes:target/dependency/* Bot</worker> </processTypes> - 重新部署后,执行命令启动worker dyno:
heroku ps:scale worker=1
2. Dyno数量未手动缩放
有时候哪怕配置正确,Heroku默认也不会自动启动dyno(比如第一次部署、之前手动关闭过dyno)。你可以直接通过命令确认并调整:
- 先查看当前dyno状态:
heroku ps - 如果显示
web.1: idle或者dyno数量为0,执行对应命令启动:# 如果你坚持要用web类型(不推荐) heroku ps:scale web=1 # 推荐用worker类型的话 heroku ps:scale worker=1
3. 主类路径不完整
你的启动命令里写的是Bot,如果这个类属于某个包(比如com.yourteam.Bot),只写类名会导致JVM找不到主类,启动失败。你可以:
- 检查
target/classes目录下的文件结构,确认Bot.class的完整包路径 - 修改启动命令为完整类名,比如:
java $JAVA_OPTS -cp target/classes:target/dependency/* com.yourteam.Bot
4. 查看完整的启动日志
你说日志只显示构建成功,可能没看到dyno启动时的报错细节。用这个命令查看实时日志,能捕捉到启动失败的具体原因:
heroku logs --tail
比如类找不到、依赖缺失、权限问题等,都会在这里显示出来。
5. 确保启动配置生效
有时候maven插件的processTypes可能没正确覆盖Heroku的默认配置,你可以在项目根目录创建一个Procfile文件(优先级高于maven插件配置),内容直接写:
worker: java $JAVA_OPTS -cp target/classes:target/dependency/* Bot
重新部署后,Heroku会直接读取这个文件的配置启动dyno。
内容的提问来源于stack exchange,提问作者Luke Prior
相关产品推荐
相关产品推荐

