昔、Process を作成して動かすものを、yipuran-core に載せてあるが、近々、削除して
書き直そうと思っている。
以下のように、標準出力も標準エラー出力も区別なく結果として取得した方が
良いのではないかと。。。
public class ScriptExecutor{ private Map<String, String> envMap; public ScriptExecutor(){} public ScriptExecutor(Map<String, String> envMap){ this.envMap = envMap; } public void setEnvMap(Map<String, String> envMap){ this.envMap = envMap; } public int run(String command, Consumer<String> consumer, BiConsumer<String, Throwable> error){ int rtn = 0; String str = null; try{ ProcessBuilder builder = new ProcessBuilder(command); builder.redirectErrorStream(true); if (envMap != null && envMap.size() > 0) { Map<String, String> environments = builder.environment(); envMap.entrySet().stream().forEach(e->environments.put(e.getKey(), e.getValue())); } Process p = builder.start(); try(BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()))){ while((str = br.readLine()) != null) { consumer.accept(str); } } p.waitFor(); rtn = p.exitValue(); }catch(Exception ex){ String stderr; rtn = 1; StringBuilder sb = new StringBuilder(); sb.append(ex.getMessage()); sb.append("\n"); sb.append(Arrays.stream(ex.getStackTrace()).map(t->t.toString()).collect(Collectors.joining("\n\t"))); Optional.ofNullable(ex.getCause()).ifPresent(x->{ sb.append("\n"); sb.append("Caused by: "); sb.append(x.getMessage()); sb.append("\n"); sb.append(Arrays.stream(x.getStackTrace()).map(t->t.toString()).collect(Collectors.joining("\n\t"))); }); stderr = sb.toString(); error.accept(stderr + ex.getMessage(), ex); } return rtn; } }