从 java 调用 ant,然后在 ant 终止后返回到 java



到目前为止,我已经从Java调用了ant脚本。现在的问题是,在 ant 构建终止后是否可以恢复 java 执行?

我该怎么做?

org.apache.tools.ant.Mainmain()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 。您可以尝试直接调用其mainstart方法,或将其某些逻辑复制到应用程序中。

完成这些方法后,应用程序应继续执行。

编辑:

保罗·卡格的回答是正确的,我不知何故错过了蚂蚁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

相关内容

  • 没有找到相关文章

最新更新