问题描述
最近在研究开源代码jhipster-online时,在执行将代码自动打包上传到gitlab上时,总是不成功。调试时总是阻塞在读取输出的地方。具体表现为:
- 程序原本应该有很多输出,但是当调用Runtime,getRuntime()实现时,无法输出。
- 只有在强制终止java程序后,才能得到想要的结果
- 在linux系统中一般没有问题,只有在windows下才能产生。
产生该问题的原因
因为执行的命令产生的标准输出比较多,而标准输出缓冲区不够大,由于缓冲区的问题,由于java进程没有清空写到缓冲区的内容,结果导致程序一直在等待。
解决方法
理论:利用Java提供的Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。
方法:
现在感觉挺多的,我这实现了两种,可以供大家参考.
- 修改命令
原命令:
jhipster.cmd --force-insight --skip-checks --skip-install --skip-cache --skip-git
新命令:
cmd jhipster.cmd --force-insight --skip-checks --skip-install --skip-cache --skip-git 2>&1
- 修改输出代码
将p.getInputStream()改成p.getErrorStream(),如下
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getErrorStream()));
while ((line = input.readLine()) != null) {
log.debug(line);
this.logsService.addLog(generationId, line);
}
input.close();
} catch (Exception e) {
log.error("Error while running the process", e);
}