首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么ant.bat在以编程方式运行时不返回错误状态?

为什么ant.bat在以编程方式运行时不返回错误状态?
EN

Stack Overflow用户
提问于 2018-06-15 02:11:13
回答 2查看 0关注 0票数 0

当我从命令行运行ant时,如果遇到故障,就会得到一个非零的退出状态(UNIX上的$?,Windows上的%ERRORLEVEL%),但是我们有一个Java程序正在运行ant(通过ProcessBuilder),当Ant失败时,在Windows上我们无法获得退出状态。

我刚刚用这个简单的ant测试文件验证了这一点:

代码语言:txt
复制
<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之后检查退出状态。无论如何,我们是这样做的。为什么我们不能通过编程来依赖这个呢?

测试程序:

代码语言:txt
复制
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;
    }
  }
}
EN

回答 2

Stack Overflow用户

发布于 2018-06-15 11:10:17

我通过创建两个额外的批处理文件(不是很好,但它有效)解决了这个问题:

文件内容myant.bat:

代码语言:txt
复制
call ant2.bat %*

文件内容ant2.bat:

代码语言:txt
复制
call ant.bat %*
if errorlevel 1 (goto ERROR_EXIT)
exit /B 0
:ERROR_EXIT
exit /B 1

现在我可以打电话了myant.bat作为Process从java获得正确的退出值。

对不起,我不能说何必这个很管用。这只是许多尝试的结果。

票数 0
EN

Stack Overflow用户

发布于 2018-06-15 12:03:44

在ANT.BAT文件末尾添加以下快速修补程序:

代码语言:txt
复制
exit /b %ANT_ERROR%

它应该可以在AntRelation1.8.2或更高版本中准备好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档