import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public static Map execute(String directory,String[] cmd){
Map result = new HashMap<>();
Process p = null;
try {
ProcessBuilder builder = new ProcessBuilder(cmd);
File file = new File(directory) ;
builder.directory(file);
Map env = builder.environment();
env.put("CATALINA_HOME", file.getParent());
env.put("CATALINA_BASE", file.getParent());
logger.info("=: -----------------------");
for(String str : env.keySet()){
if(env.get(str) != null){
env.put(str, env.get(str).replaceAll("Program Files", "PROGRA~1"));
}
logger.info(str+"=: "+env.get(str));
}
logger.info("=: -----------------------");
String javaHome = System.getenv("JAVA_HOME");
if(StringUtils.isNotEmpty(javaHome)) {
javaHome = javaHome.replace("%20", " ").replaceAll("Program Files", "PROGRA~1");
}
env.put("JAVA_HOME", javaHome);
//环境可能是Path 或 PATH
String _Path = env.get("Path");
if(StringUtils.isNotEmpty(_Path)){
env.put("Path", _Path.replaceAll(""", ""));
}
String _PATH = env.get("PATH");
if(StringUtils.isNotEmpty(_PATH)){
env.put("PATH", _PATH.replaceAll(""", ""));
}
String _EXECJAVA = env.get("_EXECJAVA");
if(StringUtils.isNotEmpty(_EXECJAVA)){
env.put("_EXECJAVA", _EXECJAVA.replaceAll(""", ""));
}
String _RUNJAVA = env.get("_RUNJAVA");
if(StringUtils.isNotEmpty(_RUNJAVA)){
env.put("_RUNJAVA", _RUNJAVA.replaceAll(""", ""));
}
String _RUNJDB = env.get("_RUNJDB");
if(StringUtils.isNotEmpty(_RUNJDB)){
env.put("_RUNJDB", _RUNJDB.replaceAll(""", ""));
}
for(String str : env.keySet()){
logger.info(str+"=: "+env.get(str));
}
logger.info("正在执行命令...." + builder.directory());
p = builder.start();
logger.info("正在执行命令....");
InputStream errorStream = p.getErrorStream();
ExecutorService exec = Executors.newCachedThreadPool();
Future errorSubmit = exec.submit(new WorkCallable(p, errorStream,"ERROR"));
InputStream correctStream = p.getInputStream();
Future correctSubmit = exec.submit(new WorkCallable(p, correctStream,"STDOUT"));
logger.info("正在执行命令2....");
String errorMsg = errorSubmit.get();
String successMsg = correctSubmit.get();
logger.info(errorMsg);
logger.info(successMsg);
if(StringUtils.isEmpty(errorMsg)) {
result.put("status", "success");
result.put("msg", successMsg);
} else {
result.put("status", "error");
result.put("msg", errorMsg);
}
p.waitFor();
exec.shutdown();
} catch (Exception e) {
result.put("status", "error");
result.put("msg", e.getMessage());
logger.error("执行命令异常,请检查参数",e.getMessage());
}
return result;
}