在我的程序中,我试图通过Java代码执行make
。
这是我列表中的一部分:
this.makefileGenerator.generate();
Process proc = this.makefileGenerator.runCompiler();
//this.stream.println(IOUtils.toString(proc.getInputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
while ((line = reader.readLine()) != null)
System.out.println("\n" + line);
try {
int result;
if ((result=proc.waitFor()) == 0)
this.stream.println("Done!");
else {
proc.getInputStream()
通话期间似乎阻止了执行。事实上,我的程序不会崩溃但永远不会终止。
在控制台输出中,我有:
make: Entering directory '/cygdrive/c/Users/cr01046/Documents/workspace/ocelot/jni'
gcc -shared -m32 -D__int64=int64_t -LC:/gtk/lib -lintl -mms-bitfields -IC:/gtk/include/glib-2.0 -IC:/gtk/lib/glib-2.0/include -IC:/'Program Files'/Java/jdk1.8.0_73/include -IC:/'Program Files'/Java/jdk1.8.0_73/include/win32 -o ../Test.dll lists.c ocelot.c EN_CBridge.c main.c -lglib-2.0
我也尝试通过提示抛出make
并且编译正确终止(但是有几个警告)。我不明白为什么在这种情况下make
有效,而通过Java它不会终止。
答案 0 :(得分:1)
如果编译生成警告,但是从Java运行时没有看到警告,则警告将写入STDERR,并且您不会使用STDERR。根据错误输出的数量,当缓冲区已满时,make进程可能已停止。
如果Process
是使用ProcessBuilder
创建的,那么您应该调用redirectErrorStream(true)
将错误输出与标准输出合并。