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命令。
答案 0 :(得分:5)
问题是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()
}
。我最好的解决方案是检查平台。像这样:
var multi = [];
var group = 'fruit';
var fruit_name = 'apple';
multi[group][fruit_name].push({'berbiji' : 'ya', 'panen' : '3tahun'});
答案 1 :(得分:0)
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");
}
}