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 Project
和 Target
,设置通常在构建文件中设置的 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? 答案是:您不知道。最终,您必须愿意深入研究并阅读源代码。上面的示例只是为了激发您的兴趣并让您入门。加油!