Scala应用通过shell启动Node服务时设置环境变量报错如何解决
问题原因
你当前使用的Scala Process字符串调用语法默认不会通过Shell解析命令,执行时会直接按空格拆分命令片段,把第一个片段TEST_ENV_VAR=fake-key识别为待执行的可执行文件,因此抛出找不到文件的报错。
解决方案
方案1:显式调用Shell执行(适合简单场景)
把完整命令封装到sh -c的参数中,交给Shell完成环境变量解析:
import java.nio.file.{Files, Path} import scala.language.postfixOps import scala.sys.process._ @main def app() = val path = Path.of(scala.sys.props.get("user.home").get + "/projects") s"sh -c 'TEST_ENV_VAR=fake-key node $path/node-server/server.js'" !!
注意:如果文件路径包含空格或特殊字符,需要提前对路径做转义处理,避免Shell解析出错。
方案2:使用ProcessBuilder传入环境变量(更安全,推荐)
直接通过Scala Process的官方API传入环境变量,不依赖Shell解析,也避免Shell注入风险:
import java.nio.file.{Files, Path} import scala.language.postfixOps import scala.sys.process.Process @main def app() = val path = Path.of(scala.sys.props.get("user.home").get + "/projects") // 第一个参数:命令+参数序列,第二个参数:工作目录(None表示继承当前进程工作目录),后续参数:环境变量键值对 Process( Seq("node", s"$path/node-server/server.js"), None, "TEST_ENV_VAR" -> "fake-key" ).!!
内容的提问来源于stack exchange,提问作者Harrison Sligting
相关产品推荐
相关产品推荐

