【问题标题】:How to run NPM Command in Java using Process Builder如何使用 Process Builder 在 Java 中运行 NPM 命令
【发布时间】:2016-11-09 09:01:18
【问题描述】:
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 命令的解决方法。如果我这样做,我会收到以下错误

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

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

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

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

【问题讨论】:

    标签: java node.js npm processbuilder


    【解决方案1】:

    问题是 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()
    }
    

    【讨论】:

    • 是的,谢谢@Wollnyst。它工作正常。
    • 代码中应该是"npm.cmd"而不是"npm.cm"
    【解决方案2】:

    在 Unix 或 Linux 操作系统中,PathBuilder 采用默认环境路径,因此我们必须更改环境路径并通过 bash 运行 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");
    }
    
    }
    

    【讨论】:

    • 这也适用于 macOS(因为 macOS 是基于 Unix 构建的)。我无法获得为 macOS 工作的其他答案。
    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 2014-08-28
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    相关资源
    最近更新 更多