到目前为止,我已经从Java调用了ant脚本。现在的问题是,在 ant 构建终止后是否可以恢复 java 执行?
我该怎么做?
org.apache.tools.ant.Main
的main()
和startAnt()
方法调用exit()
方法,而方法又调用System.exit(code)
。
解决方案(假设您调用这些方法之一(是子类org.apache.tools.ant.Main
并重写exit()
方法
/**
* This operation is expected to call {@link System#exit(int)}, which
* is what the base version does.
* However, it is possible to do something else.
* @param exitCode code to exit with
*/
protected void exit(int exitCode) {
System.exit(exitCode);
}
查看 Ant 主类的来源,org.apache.tools.ant.Main
。您可以尝试直接调用其main
或start
方法,或将其某些逻辑复制到应用程序中。
编辑:
保罗·卡格的回答是正确的,我不知何故错过了蚂蚁Main
打电话给System.exit()
的事实。
关于main
/start
/startAnt
方法的另一件事是,它们期望参数作为字符串数组。这可能很方便,但它不是特别类型安全或面向对象。要为给定的构建文件和目标调用 Ant,可以使用如下方法:
public static void runAnt(String buildfile, String target) throws Exception {
File buildFile = new File(buildfile);
Exception error = null;
org.apache.tools.ant.Project project = new org.apache.tools.ant.Project();
try {
project.addBuildListener(new org.apache.tools.ant.listener.Log4jListener());
project.fireBuildStarted();
project.init();
project.setUserProperty(org.apache.tools.ant.MagicNames.ANT_FILE, buildFile.getAbsolutePath());
org.apache.tools.ant.ProjectHelper.configureProject(project, buildFile);
project.executeTarget(target);
} catch (Exception e) {
error = e;
throw e;
} finally {
project.fireBuildFinished(error);
}
}
Process p = Runtme.getRuntime.exec("ant mytarget");
p.waitFor(); // waits until process completes before continuing to next line
// continue Java program here