java - 如何使用 Process Builder 在 Java 中运行 NPM 命令

标签 java node.js npm processbuilder

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.*;

public class TestUnZip {
    public static void main(String[] args) throws IOException, InterruptedException{
        String destFolder="E:\\TestScript";
        /*
        *  Location where the Nodejs Project is Present
        */
        System.out.println(destFolder);

        String cmdPrompt="cmd";
        String path="/c";
        String npmUpdate="npm update";
        String npm="npm";
        String update="update";

        File jsFile=new File(destFolder);
        List<String> updateCommand=new ArrayList<String>();
        updateCommand.add(cmdPrompt);
        updateCommand.add(path);
        updateCommand.add(npmUpdate);

        runExecution(updateCommand,jsFile);

    }
    public static void runExecution(List<String> command, File navigatePath) throws IOException, InterruptedException{

        System.out.println(command);

        ProcessBuilder executeProcess=new ProcessBuilder(command);
        executeProcess.directory(navigatePath);
        Process resultExecution=executeProcess.start();

        BufferedReader br=new BufferedReader(new InputStreamReader(resultExecution.getInputStream()));
        StringBuffer sb=new StringBuffer();

        String line;
        while((line=br.readLine())!=null){
            sb.append(line+System.getProperty("line.separator"));
        }
        br.close();
        int resultStatust=resultExecution.waitFor();
        System.out.println("Result of Execution"+(resultStatust==0?"\tSuccess":"\tFailure"));
    }
}

上面的程序工作正常,但这个程序依赖于 Windows 机器,我也想在其他机器上运行相同的程序。

1) NPM 是一个命令,作为 NodeJS 的 bundle 出现。 (我将 NodeJS 作为服务运行,我已经定义了环境变量,所以我可以从任何文件夹运行 npm update 命令)

2) 在不使用 "cmd", "/c" 的情况下,我无法找到运行 npm update 命令的解决方法。如果我这样做,我会收到以下错误

Exception in thread "main" java.io.IOException: Cannot run program "npm update" (in directory "E:\TestScript"): CreateProcess error=2, The system cannot find the file specified at java.lang.ProcessBuilder.start(Unknown Source)

3) 我们是否可以选择运行 npm update 命令作为 Node.exe 的参数。如果是这样,任何人都可以为我提供适当的解决方法。

4) 和我一样,我使用mocha框架运行测试脚本,结果生成.xml文件。

5) 我还希望使用进程构建器调用 mocha 命令。

最佳答案

问题是 ProcessBuilder 不遵守 PATHEXT Windows 上的变量。

在 Windows 上确实没有 npm 二进制文件,有一个 npm.cmd。我最好的解决方案是检查平台。像这样:

static boolean isWindows() {
    return System.getProperty("os.name").toLowerCase().contains("win");
}

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

static void run() {
    Process process = new ProcessBuilder(npm, "update")
            .directory(navigatePath)
            .start()
}

关于java - 如何使用 Process Builder 在 Java 中运行 NPM 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40503074/

相关文章:

Java 应用程序找不到访问 GCP Pub/Sub 的凭据

java - “〜”运算符做什么?

node.js - 当 npm 安装完成时播放声音或通知

java - 为什么我在尝试使用库中的类时收到 "Cannot resolve symbol"?

java - javadoc 注释中的 'HTML' 是否会降低可读性?是这样,还有什么选择呢?

javascript - Koa 中异步函数的奇怪问题

node.js - 如何从 Node 中正确终止 Go 进程

node.js - 获取任务在 59.05 秒后超时 aws lambda nodejs

javascript - 打印所有已安装的 node.js 模块的列表

node.js - 安装 npm 包时出错