paopao_426
2021-10-15 16:27
采纳率: 50%
浏览 221
已结题

java调用node报错,Cannot run program "node": error=2, 没有那个文件或目录

我在springboot中启动nodejs进行截图。java代码如下。

 List<String> commands = new ArrayList<>();
            commands.add("node");
            commands.add(puppeteerjs_path + "baidutime.js");
            commands.add(fileURI);
            ProcessBuilder processBuilder = new ProcessBuilder();
            processBuilder.command(commands);
            process = processBuilder.start();

linux的虚拟机上安装了nodejs,环境变量也配置OK,运行node测试没问题。但是部署完springboot应用运行到调用node时就报错了。

java.io.IOException: Cannot run program "node": error=2, 没有那个文件或目录
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) ~[?:1.8.0_131]
    at cn.com.autohome.screenshot.service.impl.ScreenShotServiceImpl.puppeteerExecute(ScreenShotServiceImpl.java:839) [classes!/:0.0.1-SNAPSHOT]
    at cn.com.autohome.screenshot.service.impl.ScreenShotServiceImpl.processExecute(ScreenShotServiceImpl.java:246) [classes!/:0.0.1-SNAPSHOT]
    at cn.com.autohome.screenshot.service.impl.ScreenShotServiceImpl.process(ScreenShotServiceImpl.java:163) [classes!/:0.0.1-SNAPSHOT]
    at cn.com.autohome.screenshot.service.impl.ScreenShotServiceImpl$1.run(ScreenShotServiceImpl.java:142) [classes!/:0.0.1-SNAPSHOT]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_131]
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [?:1.8.0_131]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_131]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [?:1.8.0_131]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_131]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_131]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]
Caused by: java.io.IOException: error=2, 没有那个文件或目录
    at java.lang.UNIXProcess.forkAndExec(Native Method) ~[?:1.8.0_131]
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:247) ~[?:1.8.0_131]
    at java.lang.ProcessImpl.start(ProcessImpl.java:134) ~[?:1.8.0_131]
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) ~[?:1.8.0_131]
    ... 11 more

怀疑是环境变量问题。首先查看 env 没问题,PATH里node目录都在。再次查看springboot程序进程的env =》cat /proc/24341/environ
发现PATH里没有node


SHELL=/bin/bash
USER=screenshot-core-test
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
PWD=/
LANG=zh_CN.UTF-8
SHLVL=1
HOME=/home/screenshot-core-test
LOGNAME=screenshot-core-test
_=/usr/sbin/start-stop-daemon
You have new mail in /var/spool/mail/root

linux切换到这个USER=screenshot-core-test后,编辑了.bash_profile后,再出发程序执行,问题仍然存在。
请教各位。

  • 好问题 提建议
  • 收藏

7条回答 默认 最新

  • kk1924 2021-10-19 16:06
    已采纳

    1、node要绝对路径
    2、java要有权限
    3、java中的命令和参数,要留有合适的空格

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • D狂风R 2021-10-16 11:11
    
            List<String> commands = new ArrayList<>();
            commands.add("node");
            commands.add("-h");
            ProcessBuilder processBuilder = new ProcessBuilder();
    
            processBuilder.directory(new File("/usr/local/bin/"));//切换工作目录
            processBuilder.command(commands);
            Process process = processBuilder.start();
    
    评论
    解决 1 无用
    打赏 举报
    1人已打赏
  • 孙叫兽 2021-10-15 18:04

    需要将nodejs可执行文件符号链接到节点

     

    sudo ln -s "$(which nodejs)" /usr/local/bin/node

    评论
    解决 无用
    打赏 举报
    1人已打赏
  • 李筱宝 2021-10-15 18:30

    看一下是不是权限问题 java 有没有 执行 node 的权限

    评论
    解决 无用
    打赏 举报
    1人已打赏
  • xiongbz154 2021-10-15 19:37

    在IDEA的Terminal中运行“node -v” 试下,如果不行 在Terminal里面执行"source ~/.bash_profile",然后再“node -v”看下结果。

    评论
    解决 无用
    打赏 举报
  • Altair刹那 2021-10-18 10:53

    win+R 运行一下cmd,看一下node -v的版本,14及以上的版本我经常出问题,现在用的12版本的

    评论
    解决 无用
    打赏 举报
  • 精英女王 2021-10-18 16:11

    先查看容器

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题