在 Ant 之外使用 Apache Ant™ 任务

基本原理

Apache Ant 为构建文件创建者和管理员提供了一套丰富的任务。但是程序员呢?Ant 任务提供的功能可以在 Java 程序中使用吗?

可以,而且非常容易。但是,在深入了解细节之前,我们应该提一下这种方法的优缺点。

优点

健壮 Ant 任务非常健壮。它们已经被许多人使用过。Ant 任务已在许多不同的环境中使用,因此已被设计为处理许多边界条件和潜在的隐藏错误。
跨平台 Ant 任务是跨平台的。它们已在所有主流平台以及一些相当不寻常的平台(例如 Netware 和 OS/390)上进行了测试。
社区支持 使用 Ant 任务意味着您需要维护的代码更少。Ant 代码由整个 Apache Ant 社区支持。

缺点

依赖于 Ant 库 显然,如果您在代码中使用 Ant 任务,则必须将 ant.jar 添加到您的路径中。当然,您可以使用代码优化器删除不必要的类,但您仍然可能需要一部分 Ant 核心代码。
灵活性下降 在某些时候,如果您发现自己必须修改 Ant 代码,那么“自己动手”可能更有意义。当然,您仍然可以窃取一些代码片段和好主意。这就是开源的魅力!

示例

假设您想从 java 中以编程方式将 zip 文件解压缩到某个目录。当然,您可以编写自己的例程来执行此操作,但为什么不使用已经编写的 Ant 任务呢?

在我的示例中,我希望能够在 XSLT 转换中解压缩文件。XSLT 转换器可以通过插入 java 中的静态方法来扩展。因此,我需要一个类似于这样的函数

/**
 * Unzip a zip file into a given directory.
 *
 * @param zipFilepath A pathname representing a local zip file
 * @param destinationDir where to unzip the archive to
 */
 static public void unzip(String zipFilepath, String destinationDir)

执行此功能的 Ant 任务是 org.apache.tools.ant.taskdefs.Expand。我们所要做的就是创建一个虚拟的 Ant ProjectTarget,设置通常在构建文件中设置的 Task 参数,然后调用 execute()

首先,让我们确保我们有正确的包含项

import org.apache.tools.ant.Project;
import org.apache.tools.ant.Target;
import org.apache.tools.ant.taskdefs.Expand;
import java.io.File;

函数调用实际上非常简单

static public void unzip(String zipFilepath, String destinationDir) {

    final class Expander extends Expand {
        public Expander() {
            project = new Project();
            project.init();
            taskType = "unzip";
            taskName = "unzip";
            target = new Target();
        }
    }
    Expander expander = new Expander();
    expander.setSrc(new File(zipfile));
    expander.setDest(new File(destdir));
    expander.execute();
}

在实际应用中,您可能希望添加自己的错误处理代码,并且您可能不希望使用本地内部类。但是,该示例的目的是展示如何在相对较少的代码行中以编程方式调用 Ant 任务。

您此时可能在问自己:如何知道要调用哪些类和方法才能设置虚拟的 Project 和 Target? 答案是:您不知道。最终,您必须愿意深入研究并阅读源代码。上面的示例只是为了激发您的兴趣并让您入门。加油!