在 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? 答案是:您不知道。最終,您必須願意親自嘗試並閱讀原始碼。上述範例僅旨在激發您的興趣並讓您開始。放手去做吧!