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
相关产品推荐
相关产品推荐

