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

Heroku平台使用node-pty调用java出现cannot execute binary file错误如何解决

问题根因

你当前的传参方式不符合bash的调用规则:通过pty.spawn启动bash时没有添加-c参数,此时bash会把传入的第一个参数java识别为待执行的脚本文件路径,而非要在shell环境下运行的命令,所以会触发二进制文件无法执行的报错。你手动执行是直接在交互式shell里输入命令,走的是shell的命令解析逻辑,和代码当前的传参逻辑完全不一样,所以手动执行正常。

解决方案

方案1:调整shell调用参数(最直接)

给bash添加-c参数,把要执行的完整命令作为单字符串传入,修改代码如下:

const shell = os.platform() === 'win32' ? 'powershell.exe' : 'bash';
// 非Windows环境下给bash加-c参数,把命令拼接为单字符串
const spawnArgs = os.platform() === 'win32' 
  ? ["java", "-jar", "Klox.jar"] 
  : ["-c", "java -jar Klox.jar"];

const ptyProcess = pty.spawn(shell, spawnArgs, {
  name: 'xterm-color',
  cols: 80,
  rows: 30,
  cwd: process.env.HOME,
  env: process.env
});

方案2:直接 spawn java 进程,不经过shell层

如果不需要shell的额外特性(比如管道、环境变量扩展等),可以直接启动java进程,绕过shell传参的问题:

const ptyProcess = pty.spawn('java', ["-jar", "Klox.jar"], {
  name: 'xterm-color',
  cols: 80,
  rows: 30,
  cwd: process.env.HOME,
  env: process.env
});

方案3:检查Heroku环境的文件权限和路径

如果上面两个方案执行后还有问题,做以下排查:

  • 确认Klox.jar文件在process.env.HOME路径下存在,且有可读权限
  • 可以在启动pty进程前先打印process.env.PATH,确认/app/.jdk/bin在PATH列表中,也可以直接用java的绝对路径调用:
    const spawnArgs = os.platform() === 'win32' 
      ? ["java", "-jar", "Klox.jar"] 
      : ["-c", "/app/.jdk/bin/java -jar Klox.jar"];
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:15:03