有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么要使用ant。bat以编程方式运行时不返回错误状态?

当我从命令行运行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 Run ant打印一条失败消息,并回显$?之后打印1。 在Windows上,java Run ant找不到名为ant的程序来运行,但是java Run ant。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;
    }
  }
}

共 (2) 个答案

  1. # 1 楼答案

    你是否需要通过它来运行Ant。蝙蝠档案?它只是一个java程序,您可以直接实例化并执行Ant运行时,在VM内部执行。看看蚂蚁的内部。bat,看看它的主要类是什么,然后直接执行它

  2. # 2 楼答案

    一个快速补丁在ANT的末尾添加了以下内容。BAT文件:

    exit /b %ANT_ERROR%
    

    这个问题长期存在,最近得到了解决。请参阅Bug 41039

    它应该在ANT 1.8.2版或更高版本中准备好