如何使用Runtime.getRuntime()执行ant并关闭命令提示符.exec()

时间:2015-04-27 14:53:47

标签: java batch-file command-line ant processbuilder

我想从java执行一个ant文件。所以我决定使用Runtime.getRuntime().exec()来实现这一目标。我的java文件看起来如下所示,

Process p = Runtime.getRuntime().exec("cmd /c start ant mytarget -Darg1="+arg1+" -Darg2="+arg2+" ", null, new File("E:/ant_demo"));

System.out.println("Ant file executed");
...
...
..
System.out.println("Completed");

我的目标是使用少量参数运行路径 E:/ ant_demo 中的ant文件。完成ant文件后,应执行剩余的代码。

当我运行此代码时,会为ant打开一个单独的命令提示符窗口,其余代码也会在ant文件完成之前并行执行。为了让代码等到ant完成,我改变了我的代码,如下所示,

    Process p = Runtime.getRuntime().exec("cmd /c start /wait ant mytarget -Darg1="+arg1+" -Darg2="+arg2+" ", null, new File("E:/ant_demo"));
    p.waitFor();

    System.out.println("Ant file executed");
    ...
    ...
    ..
    System.out.println("Completed");

在此更改之后,即使在ant完成后,剩余的代码也没有被执行,并且用于ant的命令提示符保持打开状态。当我手动关闭用于ant的命令提示符时,剩余的代码将被执行。

如何让ant使用的命令提示符自动关闭?或者如何更改我的代码以运行ant文件并在ant完成后执行剩余的代码一次?

我试图以多种方式实现这一目标,但仍面临这个问题。

1 个答案:

答案 0 :(得分:1)

您可以通过调用普通的Ant可执行文件来运行Ant脚本(ProcessBuilder可以执行)。 ANT_HOME环境变量通常指向Ant安装,因此您可以从中构建可执行文件的路径:

String antHome = System.getenv().get("ANT_HOME");
String antExecutable = antHome + File.separator + "bin" + File.separator + "ant.bat";

List<String> command = new ArrayList<String>();
command.add(antExecutable);
command.add("mytarget");
command.add("-Darg1="+arg1);
command.add("-Darg2="+arg2);
command.add("-propertyfile");
command.add("myproperty.properties");

ProcessBuilder processBuilder = new ProcessBuilder(command);
processBuilder.directory(new File("E:/ant_demo")); // set working directory
Process process = processBuilder.start(); // run process

// get an input stream connected to the normal output of the process
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while (( line = reader.readLine ()) != null) {
    System.out.println(line);
}
System.out.println("Ant file executed");
...
...
System.out.println("Completed");

请注意,在调用ProcessBuilder#start()之后,将检索输入流以读取Ant命令的输出并将其打印到System.out。有关详细信息,请参阅Java Process with Input/Output Stream

相关问题