Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Runtime.getRuntime().exec()执行ant并关闭命令提示符_Java_Batch File_Command Line_Ant_Processbuilder - Fatal编程技术网

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

Java 如何使用Runtime.getRuntime().exec()执行ant并关闭命令提示符,java,batch-file,command-line,ant,processbuilder,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"); ... .

我想从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\u 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完成后执行剩余的代码


我尝试了很多方法来实现这一点,但仍然面临这个问题。

您可以通过调用普通的Ant可执行文件来运行Ant脚本(ProcessBuilder也可以)。
ANT\u 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");
String antHome=System.getenv().get(“ANT_HOME”);
字符串antExecutable=antHome+File.separator+“bin”+File.separator+“ant.bat”;
List命令=new ArrayList();
添加命令(可执行);
添加(“mytarget”);
添加(“-Darg1=“+arg1”);
add(“-Darg2=“+arg2”);
添加(“-propertyfile”);
添加(“myproperty.properties”);
ProcessBuilder ProcessBuilder=新的ProcessBuilder(命令);
processBuilder.directory(新文件(“E:/ant_demo”);//设置工作目录
Process=processBuilder.start();//运行过程
//获取连接到进程正常输出的输入流
InputStream InputStream=process.getInputStream();
BufferedReader reader=新的BufferedReader(新的InputStreamReader(inputStream));
字符串行=null;
而((line=reader.readLine())!=null){
系统输出打印项次(行);
}
System.out.println(“Ant文件已执行”);
...
...
系统输出打印项次(“完成”);

请注意,调用
ProcessBuilder#start()
后,将检索一个输入流,以读取Ant命令的输出并将其打印到
System.out
。有关更多信息,请参阅。

是否必须调用
cmd
窗口?您不能在没有
cmd/c…
的情况下执行脚本吗?您好,manouti,我删除了开始选项,但仍然没有执行剩余的代码。@manouti,它不是特定于使用cmd窗口运行的。除了cmd winodw之外,还有其他方法可以使用java运行ant文件吗?如何将propertyfile名称与目标名称一起传递。使用命令提示符,我将执行类似于
ant-propertyfile myproperty.properties targetName
的操作。上述代码未加载此属性。如何实现这一点?@Jugi只需通过添加这些选项来更新
命令
列表。我添加了
command.add(antExecutable)
命令。添加(“-propertyfile”)
command.add(“myproperty.properties”)
命令。添加(“targetName”)。但是它不能正常工作。@Jugi你能用你尝试过的和得到的错误/意外行为来更新吗?我的错,我传递了错误的参数。这是完美的工作,因为我想。非常感谢:)