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

Heroku部署Scala/Play应用报错:无法找到node程序

Scala/Play应用部署Heroku时提示找不到node程序的解决办法

问题描述

我尝试使用sbt将Scala/Play应用部署到Heroku平台,但持续遇到报错,提示无法运行node程序(No such file or directory)。已配置heroku/scala和heroku/nodejs两个构建包,执行heroku buildpacks显示顺序为1.heroku/scala、2.heroku/nodejs。作为Scala新手,多方搜索仍未找到解决方案,想请教可能的问题原因及解决办法。

报错详情

remote: Downloaded https://repo1.maven.org/maven2/org/typelevel/machinist_sjs0.6_2.12/0.6.2/machinist_sjs0.6_2.12-0.6.2.jar
remote:        [info] Compiling 626 Scala sources to /tmp/scala_buildpack_build_dir/shared/.js/target/scala-2.12/classes...
remote:        [info] LESS compiling on 3 source(s)
remote:        [ERROR] [08/11/2022 14:30:33.182] [sbt-web-akka.actor.default-dispatcher-8] [akka://sbt-web/user/$b/process] null
remote:        akka.actor.ActorInitializationException: exception during creation
remote:         at akka.actor.ActorInitializationException$.apply(Actor.scala:166)
remote:         at akka.actor.ActorCell.create(ActorCell.scala:596)
remote:         at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:456)
remote:         at akka.actor.ActorCell.systemInvoke(ActorCell.scala:478)
remote:         at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:263)
remote:         at akka.dispatch.Mailbox.run(Mailbox.scala:219)
remote:         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
remote:         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
remote:         at java.lang.Thread.run(Thread.java:750)
remote:        Caused by: java.lang.reflect.InvocationTargetException
remote:         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
remote:         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
remote:         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
remote:         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
remote:         at akka.util.Reflect$.instantiate(Reflect.scala:66)
remote:         at akka.actor.ArgsReflectConstructor.produce(Props.scala:355)
remote:         at akka.actor.Props.newActor(Props.scala:255)
remote:         at akka.actor.ActorCell.newActor(ActorCell.scala:552)
remote:         at akka.actor.ActorCell.create(ActorCell.scala:578)
remote:         ... 7 more
remote:        Caused by: java.io.IOException: Cannot run program "node": error=2, No such file or directory
remote:         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
remote:         at akka.contrib.process.BlockingProcess.<init>(BlockingProcess.scala:55)
remote:         ... 16 more
remote:        Caused by: java.io.IOException: error=2, No such file or directory
remote:         at java.lang.UNIXProcess.forkAndExec(Native Method)
remote:         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
remote:         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
remote:         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
remote:         ... 17 more
remote:
remote:        [ERROR] [08/11/2022 14:30:33.183] [sbt-web-akka.actor.default-dispatcher-4] [akka://sbt-web/user/$a/process] null
remote:        akka.actor.ActorInitializationException: exception during creation
remote:         at akka.actor.ActorInitializationException$.apply(Actor.scala:166)
remote:         at akka.actor.ActorCell.create(ActorCell.scala:596)
remote:         at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:456)
remote:         at akka.actor.ActorCell.systemInvoke(ActorCell.scala:478)
remote:         at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:263)
remote:         at akka.dispatch.Mailbox.run(Mailbox.scala:219)
remote:         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
remote:         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
remote:         at java.lang.Thread.run(Thread.java:750)
remote:        Caused by: java.lang.reflect.InvocationTargetException
remote:         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
remote:         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
remote:         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
remote:         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
remote:         at akka.util.Reflect$.instantiate(Reflect.scala:66)
remote:         at akka.actor.ArgsReflectConstructor.produce(Props.scala:355)
remote:         at akka.actor.Props.newActor(Props.scala:255)
remote:         at akka.actor.ActorCell.newActor(ActorCell.scala:552)
remote:         at akka.actor.ActorCell.create(ActorCell.scala:578)
remote:         ... 7 more
remote:        Caused by: java.io.IOException: Cannot run program "node": error=2, No such file or directory
remote:         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
remote:         at akka.contrib.process.BlockingProcess.<init>(BlockingProcess.scala:55)
remote:         ... 16 more
remote:        Caused by: java.io.IOException: error=2, No such file or directory
remote:         at java.lang.UNIXProcess.forkAndExec(Native Method)
remote:         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
remote:         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
remote:         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
remote:         ... 17 more
remote:
remote:        [ERROR] [08/11/2022 14:30:33.203] [sbt-web-akka.actor.default-dispatcher-8] [akka://sbt-web/user/$c/process] null
remote:        akka.actor.ActorInitializationException: exception during creation
remote:         at akka.actor.ActorInitializationException$.apply(Actor.scala:166)
remote:         at akka.actor.ActorCell.create(ActorCell.scala:596)
remote:         at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:456)
remote:         at akka.actor.ActorCell.systemInvoke(ActorCell.scala:478)
remote:         at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:263)
remote:         at akka.dispatch.Mailbox.run(Mailbox.scala:219)
remote:         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
remote:         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
remote:         at java.lang.Thread.run(Thread.java:750)
remote:        Caused by: java.lang.reflect.InvocationTargetException
remote:         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
remote:         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
remote:         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
remote:         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
remote:         at akka.util.Reflect$.instantiate(Reflect.scala:66)
remote:         at akka.actor.ArgsReflectConstructor.produce(Props.scala:355)
remote:         at akka.actor.Props.newActor(Props.scala:255)
remote:         at akka.actor.ActorCell.newActor(ActorCell.scala:552)
remote:         at akka.actor.ActorCell.create(ActorCell.scala:578)
remote:         ... 7 more
remote:        Caused by: java.io.IOException: Cannot run program "node": error=2, No such file or directory
remote:         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
remote:         at akka.contrib.process.BlockingProcess.<init>(BlockingProcess.scala:55)
remote:         ... 16 more
remote:        Caused by: java.io.IOException: error=2, No such file or directory
remote:         at java.lang.UNIXProcess.forkAndExec(Native Method)
remote:         at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
remote:         at java.lang.ProcessImpl.start(ProcessImpl.java:134)
remote:         at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
remote:         ... 17 more
remote:
remote:        [info] Compiling 74 Scala sources to /tmp/scala_buildpack_build_dir/client/target/scala-2.12/classes...
remote:        [info] Full optimizing /tmp/scala_buildpack_build_dir/client/target/scala-2.12/client-opt.js
remote:        [info] Closure: 0 error(s), 0 warning(s)

问题原因及解决办法

核心原因

Heroku构建包按顺序执行,当前先运行Scala构建包,此时Node环境还未被nodejs构建包安装,导致sbt编译过程中调用node时找不到程序。

解决步骤

1. 调整构建包顺序

将heroku/nodejs构建包移到第一位,让Heroku先安装Node环境,再执行Scala构建:

# 先移除原有的nodejs构建包
heroku buildpacks:remove heroku/nodejs
# 添加到第一位
heroku buildpacks:add --index 1 heroku/nodejs

或者直接重置顺序:

heroku buildpacks:set heroku/nodejs
heroku buildpacks:add heroku/scala

执行完后用heroku buildpacks确认顺序为1.heroku/nodejs、2.heroku/scala。

2. 确保Node路径被正确识别

如果调整顺序后仍报错,可能是sbt无法自动识别Node的安装路径。可以在项目根目录创建.profile文件,添加以下内容,将Node的bin目录加入系统PATH:

export PATH=$PATH:/app/.heroku/node/bin

3. 直接在sbt配置中指定Node路径

如果项目使用sbt-web处理前端资源(比如LESS编译),可以在build.sbt中直接指定node的绝对路径:

import com.typesafe.sbt.web.SbtWeb.autoImport._
WebKeys.nodeCommand := "/app/.heroku/node/bin/node"

内容的提问来源于stack exchange,提问作者Holger Sindbaek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:06:24