You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:22:35