如何使用Process Builder在Java中运行NPM命令 import java.io.BufferedOutputStream; 导入java.io.BufferedReader; 导入java.io.File; 导入java.io.FileInputStream; 导入java.io.FileNotFoundException; 导入java.io.FileOutputStream; 导入java.io.IOException; 导入java.io.InputStreamReader; 导入java.util.ArrayList; 导入java.util.List; 导入java.util.*; 公共类TestUnZip{ 公共静态void main(字符串[]args)引发IOException、InterruptedException{ String destFolder=“E:\\TestScript”; /* *存在Nodejs项目的位置 */ System.out.println(destFolder); 字符串cmdPrompt=“cmd”; 字符串路径=“/c”; 字符串npmUpdate=“npm update”; 字符串npm=“npm”; 字符串update=“update”; File jsFile=新文件(destFolder); List updateCommand=new ArrayList(); updateCommand.add(cmdPrompt); updateCommand.add(路径); updateCommand.add(npmUpdate); 运行执行(updateCommand,jsFile); } publicstaticvoidrunexecution(List命令,filenavigatePath)抛出IOException、interruptedeexception{ System.out.println(命令); ProcessBuilder executeProcess=新建ProcessBuilder(命令); executeProcess.directory(navigatePath); Process resultExecution=executeProcess.start(); BufferedReader br=新的BufferedReader(新的InputStreamReader(resultExecution.getInputStream()); StringBuffer sb=新的StringBuffer(); 弦线; 而((line=br.readLine())!=null){ sb.append(line+System.getProperty(“line.separator”); } br.close(); int resultStatust=resultExecution.waitFor(); System.out.println(“执行结果”+(resultStatust==0?”\t成功):“\t失败”); } }

如何使用Process Builder在Java中运行NPM命令 import java.io.BufferedOutputStream; 导入java.io.BufferedReader; 导入java.io.File; 导入java.io.FileInputStream; 导入java.io.FileNotFoundException; 导入java.io.FileOutputStream; 导入java.io.IOException; 导入java.io.InputStreamReader; 导入java.util.ArrayList; 导入java.util.List; 导入java.util.*; 公共类TestUnZip{ 公共静态void main(字符串[]args)引发IOException、InterruptedException{ String destFolder=“E:\\TestScript”; /* *存在Nodejs项目的位置 */ System.out.println(destFolder); 字符串cmdPrompt=“cmd”; 字符串路径=“/c”; 字符串npmUpdate=“npm update”; 字符串npm=“npm”; 字符串update=“update”; File jsFile=新文件(destFolder); List updateCommand=new ArrayList(); updateCommand.add(cmdPrompt); updateCommand.add(路径); updateCommand.add(npmUpdate); 运行执行(updateCommand,jsFile); } publicstaticvoidrunexecution(List命令,filenavigatePath)抛出IOException、interruptedeexception{ System.out.println(命令); ProcessBuilder executeProcess=新建ProcessBuilder(命令); executeProcess.directory(navigatePath); Process resultExecution=executeProcess.start(); BufferedReader br=新的BufferedReader(新的InputStreamReader(resultExecution.getInputStream()); StringBuffer sb=新的StringBuffer(); 弦线; 而((line=br.readLine())!=null){ sb.append(line+System.getProperty(“line.separator”); } br.close(); int resultStatust=resultExecution.waitFor(); System.out.println(“执行结果”+(resultStatust==0?”\t成功):“\t失败”); } },java,node.js,npm,processbuilder,Java,Node.js,Npm,Processbuilder,上面的程序运行良好,但是这个程序依赖于Windows机器,我想在其他机器上运行同样的程序 1) NPM是一个命令,它是由NodeJS组合而成的。(我将NodeJS作为服务运行,我已经定义了环境变量,因此可以从任何文件夹运行npm update命令) 2) 如果不使用“cmd”、“/c”,我找不到运行npm update命令的解决方法。如果我这样做,我会得到以下错误 线程“main”java.io.IOException中的异常:无法运行程序“npm update”(在目录“E:\TestScri

上面的程序运行良好,但是这个程序依赖于Windows机器,我想在其他机器上运行同样的程序

1) NPM是一个命令,它是由
NodeJS
组合而成的。(我将NodeJS作为服务运行,我已经定义了环境变量,因此可以从任何文件夹运行npm update命令)

2) 如果不使用
“cmd”、“/c”
,我找不到运行npm update命令的解决方法。如果我这样做,我会得到以下错误

线程“main”java.io.IOException中的异常:无法运行程序“npm update”(在目录“E:\TestScript”中):CreateProcess error=2,系统找不到指定的文件 位于java.lang.ProcessBuilder.start(未知源)

3) 我们是否可以选择将npm update命令作为
Node.exe
的参数运行。如果是这样的话,谁能为我提供合适的工作环境呢

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


5) 我希望还可以使用process builder调用mocha命令。

问题在于
ProcessBuilder
不尊重Windows上的变量

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

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"));
    }
}
在Unix或Linux操作系统中,PathBuilder采用默认的环境路径,因此我们必须更改环境路径并通过bash运行npm命令。
导入java.io.File;
导入java.util.Map;
公共类命令执行器{
public void exceuteCommand(String命令String,String
执行指令的董事会){
试一试{
ProcessBuilder ProcessBuilder=newProcessBuilder(新字符串{“bash”,“-c”,commandString});
Map env=processBuilder.environment();
目录(新文件(directoryToExecuteCommand));
字符串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”;
环境投入(“路径”,环境路径);
processBuilder.start();
}捕获(例外e){
e、 printStackTrace();
}
}
公共静态void main(字符串参数[]){
CommandExecutor CommandExecutor=新CommandExecutor();
commandExecutor.exceuteCommand(“npm安装”,“home/admin123/Desktop”);
}
}

是的,谢谢@Wollnyst。它工作正常。它应该是
“npm.cmd”
,而不是代码中的
“npm.cm”
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()
}
    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");
}

}