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

How to run NPM Command in Java using Process Builder

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。 (我 运行 NodeJS 作为一项服务,我已经定义了环境变量,所以我可以 运行 从任何文件夹执行 npm update 命令)

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

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 不遵守 Windows 上的 PATHEXT 变量。

确实 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()
}

在Unix或Linux os中,PathBuilder采用默认环境路径,所以我们必须通过[=13=更改环境路径和运行 npm命令].

    import java.io.File;
    import java.util.Map;

    public class CommandExecutor {
    public void exceuteCommand(String commandString,String 
    directoryToExecuteCommand) {
    try {
        ProcessBuilder processBuilder = new ProcessBuilder(new String{"bash", "-c",commandString});
        Map<String, String> env = processBuilder.environment();
        processBuilder.directory(new File(directoryToExecuteCommand));
        String envPath="/home/admin123/.nvm/versions/node/v10.15.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin";
        env.put("PATH",envPath);
        processBuilder.start();
     } catch (Exception e) {
        e.printStackTrace();
   }

  }
public static void main(String args[]) {
    CommandExecutor commandExecutor=new CommandExecutor();
    commandExecutor.exceuteCommand("npm install", "/home/admin123/Desktop");
}

}