当我从命令行运行ant时,如果遇到故障,就会得到一个非零的退出状态(UNIX上的$?,Windows上的%ERRORLEVEL%),但是我们有一个Java程序正在运行ant(通过ProcessBuilder),当Ant失败时,在Windows上我们无法获得退出状态。
我刚刚用这个简单的ant测试文件验证了这一点:
<project name="x" default="a">
<target name="a">
<fail/>
</target>
</project>
在UNIX上,运行ant会打印一条失败消息,然后回显$?后打印1。在Windows上,运行ant或ant.bat打印失败消息,然后回显%ERRORLEVEL%之后打印1。
现在,使用下面的测试程序:在UNIX上,java运行ant打印一条失败消息,并回显$?后打印1。在Windows上,java Runant找不到一个名为ant的程序来运行,但是java Runant.bat打印了一条失败消息,但随后打印的是%ERRORLEVEL%0.什么?
我们依靠的是能够在运行ant之后检查退出状态。无论如何,我们是这样做的。为什么我们不能通过编程来依赖这个呢?
测试程序:
import java.io.*;
public class Run {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder(args);
Process p = pb.start();
ProcThread stdout = new ProcThread(p.getInputStream(), System.out);
ProcThread stderr = new ProcThread(p.getErrorStream(), System.err);
stdout.start();
stderr.start();
int errorLevel = p.waitFor();
stdout.join();
stderr.join();
IOException outE = stdout.getException();
if (outE != null)
throw(outE);
IOException errE = stdout.getException();
if (errE != null)
throw(errE);
System.exit(errorLevel);
}
static class ProcThread extends Thread {
BufferedReader input;
PrintStream out;
IOException ex;
ProcThread(InputStream is, PrintStream out) {
input = new BufferedReader(new InputStreamReader(is));
this.out = out;
}
@Override
public void run() {
String line;
try {
while ((line = input.readLine()) != null)
out.println(line);
} catch (IOException e) {
setException(e);
}
}
private void setException(IOException e) {
this.ex = e;
}
public IOException getException() {
return ex;
}
}
}
发布于 2018-06-15 11:10:17
我通过创建两个额外的批处理文件(不是很好,但它有效)解决了这个问题:
文件内容myant.bat
:
call ant2.bat %*
文件内容ant2.bat
:
call ant.bat %*
if errorlevel 1 (goto ERROR_EXIT)
exit /B 0
:ERROR_EXIT
exit /B 1
现在我可以打电话了myant.bat
作为Process
从java获得正确的退出值。
对不起,我不能说何必这个很管用。这只是许多尝试的结果。
发布于 2018-06-15 12:03:44
在ANT.BAT文件末尾添加以下快速修补程序:
exit /b %ANT_ERROR%
它应该可以在AntRelation1.8.2或更高版本中准备好。
https://stackoverflow.com/questions/-100000285
复制相似问题