简体   繁体   English

如何使用 ProcessBuilder 在 Java 代码中运行 NPM 命令

[英]How to run NPM Command in Java code using ProcessBuilder

My environment is mac.我的环境是mac。 I'm trying to run "npm ls" from my java code but it throws error messages.我正在尝试从我的 Java 代码运行“npm ls”,但它会抛出错误消息。

My java code:我的Java代码:

String npm = isWindows() ? "npm.cmd" : "npm";

System.out.println(rootStr);
Process process = new ProcessBuilder(npm, "ls").directory(new File(rootStr)).start();

Error Message:错误信息:

Users/youngeun/Downloads/zenbot_unstable
java.io.IOException: Cannot run program "npm" (in directory "/Users/youngeun/Downloads/zenbot_unstable"): error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at com.iotcube.scanner.nodejs.npm.NpmService.npmInfo(NpmService.java:26)
    at com.iotcube.scanner.IotcubescannerApplication.main(IotcubescannerApplication.java:174)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 2 more

But it seems to work perfectly in my terminal:但它似乎在我的终端中完美运行:

| ~/Downloads/zenbot_unstable @ Youngeunui-MacBook-Pro (youngeun) 
| => npm ls
zenbot4@4.1.0 /Users/youngeun/Downloads/zenbot_unstable
├─┬ @babel/core@7.2.2
│ ├─┬ @babel/code-frame@7.0.0
│ │ └─┬ @babel/highlight@7.0.0
│ │   ├── chalk@2.4.2 deduped
│ │   ├── esutils@2.0.2 deduped
│ │   └── js-tokens@4.0.0
│ ├─┬ @babel/generator@7.3.0
│ │ ├── @babel/types@7.3.0 deduped
│ │ ├── jsesc@2.5.2
│ │ ├── lodash@4.17.11 deduped
...

I've tried solutions from other stackoverflow pages but none of them seems to work... I am so lost.. I would appreciate your help.我已经尝试过其他 stackoverflow 页面的解决方案,但它们似乎都不起作用......我很迷茫......我会很感激你的帮助。 thanks谢谢

Try providing full path to the npm executable:尝试提供npm可执行文件的完整路径:

String dir = "/Users/youngeun/Downloads/zenbot_unstable";
String npm = dir + "/npm";
Process p = new ProcessBuilder(npm, "ls")
                .director(new File(dir))
                .start();
p.waitFor();

如果您正在从 NPM 中寻找一些简单的东西,比如下载包并在本地提取它,或者搜索包或类似的东西:有替代方法 - 使用 Java 本机库来处理 NPM 注册表: https : //github.com/OrienteerBAP /JNPM

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM