依賴

管理 Java 類別檔依賴關係的任務。

說明

depend 任務會先找出哪些類別與其來源不同步,然後移除任何依賴於不同步類別的其他類別的類別檔。

depend 任務會分析傳遞給它的所有類別檔的類別檔,以找出類別依賴關係。任務不會以任何方式剖析您的來源程式碼,而是依賴編譯器編碼到類別檔中的類別參考。這通常比剖析 Java 來源檔快。

如需深入了解如何從類別檔取得這些資訊,請參閱 Java 虛擬機器規格

由於類別的依賴關係只會在類別本身變更時變更,因此 depend 任務能夠快取依賴關係資訊。只有已變更的類別檔會重新分析其依賴關係資訊。請注意,如果您透過變更來源來變更類別的依賴關係,它仍會重新編譯。您可以檢查建立的依賴關係檔,以了解類別的依賴關係。不過,請勿依賴資訊的格式,因為它可能會在後續版本中變更。

depend 找出所有類別依賴關係後,它會「反轉」此關係,以找出每個類別有哪些其他類別依賴於它。此「影響」清單用於找出哪些類別會因不同步類別而失效。會移除失效類別的類別檔,並觸發受影響類別的編譯。

depend 任務支援屬性 closure,它控制 depend 是否只考慮直接的類別對類別關係,或是否也會考慮傳遞的間接關係。例如,假設有三個類別,A 依賴於 B,而 B 又依賴於 C。現在假設類別 C 已不同步。如果不使用 closuredepend 只會移除類別 B。如果設定 closure,類別 A 也會被移除。一般來說,直接關係就已足夠,類別通常不會依賴於另一個類別,卻沒有直接關係。如果設定 closure,您會注意到 depend 通常會移除更多類別檔。

<depend>classpath 屬性為選用。如果存在,depend 會針對此類別路徑上的類別和 jar 檔檢查類別依賴關係。任何依賴於此類別路徑上的元素,且比該元素舊的類別都會被刪除。您會使用此功能的典型範例是,您正在建置一個公用程式 jar 檔,並希望確保與此 jar 檔不同步的類別會重新建置。在此類別路徑中,您不應包含您預期不會變更的 jar 檔,例如 JDK 執行時期 jar 檔或第三方 jar 檔,因為這樣只會讓依賴關係檢查變慢。這表示如果您確實為 depend 任務使用類別路徑,它可能與實際編譯您的程式碼所需的類別路徑不同。

效能

depend 任務的效能取決於許多因素,例如類別關係的複雜度,以及有多少類別檔案過期。是否重新編譯所有類別或使用 depend 任務會比較省時,取決於專案大小和類別之間的關聯性。

限制

有些來源依賴關係 depend 無法偵測

這些限制最明顯的範例是,當其他類別匯出的常數原始資料類型變更時,任務無法判斷要重新編譯哪些類別。例如,變更類似下列內容的定義

public final class Constants {
    public final static boolean DEBUG=false;
}

其他類別不會偵測到。

參數

屬性 說明 必要
srcDir 這是來源存在的目錄。depend 會檢查此目錄以判斷哪些類別已過期。如果您使用多個來源目錄,您可以將此屬性傳遞給來源目錄路徑。
destDir 這是要分析的類別檔案的根目錄。 否;預設為 srcdir
cache 這是 depend 可以儲存和擷取依賴關係資訊的目錄。 否;預設為無快取
closure 此屬性控制 depend 是否只移除直接依賴於已過期類別的類別。如果將此設定為 truedepend 會遍歷類別依賴關係圖,刪除所有受影響的類別。 否;預設為 false
dump 如果為 true,依賴關係資訊會寫入偵錯層級記錄檔 否;預設為 false
classpath 包含 <depend> 也應檢查其依賴關係的 jar 和類別的類別路徑
warnOnRmiStubs 旗標,用於停用關於看起來像是 rmic 產生的 stub/skeleton 類別且沒有 .java 來源的檔案的警告。在進行 RMI 開發時很有用。 否;預設為 true

指定為巢狀元素的參數

depend 任務的 classpath 屬性是 類似路徑的結構,也可以透過巢狀 <classpath> 元素設定。

此外,此任務會形成一個隱含的 FileSet,並支援 <fileset> 的大多數屬性(dir 變成 srcdir),以及巢狀 <include><exclude><patternset> 元素。

範例

移除 ${build.classes} 目錄中任何依賴於過期類別的類別。類別會根據 ${java.dir} 目錄中的來源,使用與 <javac> 工作相同的機制,視為過期。在此範例中,<depend> 工作會將其依賴資訊快取在 depcache 目錄中。

<depend srcdir="${java.dir}"
        destdir="${build.classes}"
        cache="depcache"
        closure="yes"/>

執行與前一個範例相同的工作,但明確包含所有 .java 檔案,但 ${java.dir}/build_excludes 中所列出的檔案除外。

<depend srcdir="${java.dir}" destdir="${build.classes}"
        cache="depcache" closure="yes">
  <include name="**/*.java"/>
  <excludesfile name="${java.dir}/build_excludes"/>
</depend>