如何在ant(1)中执行makefile(4)规则?

时间:2010-07-01 15:52:00

标签: ant makefile

我想知道如何在ant(1)中做一些等同于特定makefile(4)规则的东西。 makefile(4)规则执行以下操作:1)启动一个不终止的进程,并将一行写入其标准输出流; 2)从过程中读取行; 3)使用该行构造文件; 4)启动第二个进程,该进程不使用该文件作为参数终止。示意性地,makefile(4)规则是

program1 | while read arg; do \
    echo $$arg >file; \
    program2 file; \
done

注意:“program1”写一行; “program1”和“program2”都不会终止。

如何在ant(1)中完成?

1 个答案:

答案 0 :(得分:1)

您应该可以使用ProcessBuilder,如下所述:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class PBTest {

    public static void main(String[] args) {
        ProcessBuilder pb = new ProcessBuilder("process1");
        pb.redirectErrorStream(true);
        try {
            Process p = pb.start();
            String s;
            // read from the process's combined stdout & stderr
            BufferedReader stdout = new BufferedReader (
                new InputStreamReader(p.getInputStream()));
            if ((s = stdout.readLine()) != null) {
                ProcessBuilder pb2 = new ProcessBuilder("process2", s);
                pb2.start();
                ...
            }
            System.out.println("Exit value: " + p.waitFor());
            p.getInputStream().close();
            p.getOutputStream().close();
            p.getErrorStream().close();
         } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

然后你的java任务相当简单:

<!-- Run the program -->
<target name="run">
    <java classname="PBTest" fork="true"></java> 
</target>

附录:

  

我正在寻找ant(1)而非Java的解决方案。

您可以在script task中使用任何支持Apache BSF或JSR 223的语言。我没有看到直接使用标准输入和输出的方法,但您可以使用loadfile task从文件加载属性。这是example,它从源文件中获取版本号。