我想知道如何在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)中完成?
答案 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,它从源文件中获取版本号。