如何使用Process Builder

时间:2016-11-09 09:01:18

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

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

  

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

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

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

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

2 个答案:

答案 0 :(得分:5)

问题是ProcessBuilder不尊重Windows上的PATHEXT变量。

Windows上没有npm二进制文件,而npm.cmdstatic 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() } 。我最好的解决方案是检查平台。像这样:

var multi = [];

var group = 'fruit';
var fruit_name = 'apple';

multi[group][fruit_name].push({'berbiji' : 'ya', 'panen' : '3tahun'});

答案 1 :(得分:0)

在Unix或Linux操作系统中,PathBuilder采用默认环境路径,因此我们必须更改环境路径并通过bash运行npm命令。

    package com.ainosoft.space.manager.command.executor;
    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");
}

}