選擇器

選擇器是一種機制,透過它可以根據檔案名稱以外的條件來選擇組成 <fileset> 的檔案,例如 <include><exclude> 標籤所提供的條件。

如何使用選擇器

選擇器是 FileSet 的元素,並顯示在其中。它也可以透過使用 <selector> 標籤並將其用作參考,在任何目標外部定義。

不同的選擇器有不同的屬性。有些選擇器可以包含其他選擇器,這些選擇器稱為 選擇器容器。還有一類選擇器允許使用者定義的擴充功能,稱為 自訂選擇器。內建於 Apache Ant 的選擇器稱為 核心選擇器

核心選擇器

核心選擇器是 Ant 的標準選擇器。它們可以在檔案集中使用,也可以包含在選擇器容器中。

核心選擇器為

包含選取器

FileSet 中的 <contains> 標籤將該檔案集定義的檔案限制為僅包含 text 屬性指定的字串的檔案。

<contains> 選取器可以用作資源選取器(請參閱 <restrict> 資源集合)。

屬性 說明 必要
text 指定每個檔案都必須包含的文字
casesensitive 在尋找 text 屬性中的字串時是否注意大小寫。 否;預設為 true
ignorewhitespace 在檢查 text 屬性中的字串之前是否消除空白。 否;預設為 false
encoding 正在選取資源的編碼。自 Ant 1.9.0 起 否;預設為預設 JVM 字元編碼

以下是使用包含選取器的範例

<fileset dir="${doc.path}" includes="**/*.html">
    <contains text="script" casesensitive="no"/>
</fileset>

選取所有包含字串 script 的 HTML 檔案。

日期選取器

FileSet 中的 <date> 標籤將限制 include 標籤指定的檔案,因此最後修改日期不符合選取器指定的日期限制的標籤將不會被選取。

屬性 說明 必要
datetime 指定要測試的日期和時間。應使用美國當地格式 MM/dd/yyyy hh:mm a,或透過 pattern 屬性指定的替代模式。 兩者至少擇一
millis 自 1970 年以來應測試的毫秒數。通常使用 datetime 屬性會容易得多。
何時 指示如何詮釋日期,是否要選取最後修改時間在指定值之前、之後或等於指定值的檔案。此屬性可接受的值為
  • before—選取最後修改日期在指示日期之前的檔案
  • after—選取最後修改日期在指示日期之後的檔案
  • equal—選取最後修改日期為這個確切日期的檔案
否;預設為 equal
粒度 比較檔案修改時間時要使用的毫秒數寬限。這是必要的,因為並非每個檔案系統都支援追蹤毫秒等級的最後修改時間。 否;預設為 0 毫秒,或在 DOS 系統上為 2 秒
模式 使用目前區域設定詮釋 datetime 屬性時要使用的與 SimpleDateFormat 相容的模式。自 Ant 1.6.2 起
checkdirs 指示是否要檢查目錄的日期。 否;預設為 false

以下是日期選擇器的使用範例

<fileset dir="${jar.path}" includes="**/*.jar">
    <date datetime="01/01/2001 12:00 AM" when="before"/>
</fileset>

選取所有在 2001 年 1 月 1 日午夜之前最後修改的 JAR 檔案。

相依選擇器

<depend> 標籤選取最後修改日期晚於另一個位置中另一個等效檔案的檔案。

<depend> 標籤支援使用包含的 <mapper> 元素來定義要與之比較檔案的位置。如果未指定 <mapper> 元素,則會使用 identity 類型的對應器。

<depend> 選擇器區分大小寫。

屬性 說明 必要
targetdir 尋找要與之比較檔案的基本目錄。精確位置取決於此屬性與 <mapper> 元素(如果有的話)的組合。
粒度 決定檔案是否過期之前要提供的毫秒數寬限。這是必要的,因為並非每個檔案系統都支援追蹤毫秒等級的最後修改時間。 否;預設為 0 毫秒,或在 DOS 系統上為 2 秒

以下是相依選擇器的使用範例

<fileset dir="${ant.1.5}/src/main" includes="**/*.java">
    <depend targetdir="${ant.1.4.1}/src/main"/>
</fileset>

選取所有在 1.5 版中修改的 Java 原始碼檔案。

深度選擇器

<depth> 標籤會根據檔案在檔案集基礎目錄中所處的目錄層級深度來選取檔案。

屬性 說明 必要
min 檔案必須位於基礎目錄以下的最小目錄層級才能被選取。 兩個選項中至少選一個;預設為無限制
max 檔案位於基礎目錄以下的最大目錄層級,且仍能被選取。

以下是如何使用深度選取器的範例

<fileset dir="${doc.path}" includes="**/*">
    <depth max="1"/>
</fileset>

選取基礎目錄和其下一個目錄中的所有檔案。

不同的選取器

<different> 選取器會選取在其他位置被視為「不同」的等效檔案。判斷兩個檔案之間差異的規則如下

  1. 如果檔案只存在於套用選取器的資源集合中,但不存在於 targetdir(或套用比對器後),則選取該檔案。
  2. 如果檔案只存在於 targetdir(或套用比對器後),則忽略該檔案。
  3. 長度不同的檔案不同。
  4. 如果將 ignoreFileTimes 關閉 (off),則檔案時間戳記不同會導致檔案被視為不同。
  5. 除非將 ignoreContents 設定為 true,否則會對兩個檔案執行逐位元組檢查。

這是與無法正確處理相依性檢查的程式和任務搭配使用的有用選取器;即使前置任務總是會建立其輸出檔案,後續任務仍可由使用不同選取器建立的副本驅動,因此其相依性會根據檔案的絕對狀態驅動,而不仅仅是時間戳記。例如:從網站擷取的任何內容或某些程式的輸出。為減少檢查數量,在 <copy> 任務中使用此任務時,將 preservelastmodified 設定為 true,以將時間戳記從來源檔案傳播到目標檔案。

<different> 選取器支援使用包含的 <mapper> 元素來定義要比對的檔案位置。如果未指定 <mapper> 元素,則使用 identity 類型比對器。

屬性 說明 必要
targetdir 尋找要與之比較檔案的基本目錄。精確位置取決於此屬性與 <mapper> 元素(如果有的話)的組合。
ignoreFileTimes 是否在比較中使用檔案時間。 否;預設為 true(忽略時間差異)
ignoreContents 是否進行逐位元組比較。自 Ant 1.6.3 起 否;預設為 false(比較內容)
粒度 決定檔案是否過期之前要提供的毫秒數寬限。這是必要的,因為並非每個檔案系統都支援追蹤毫秒等級的最後修改時間。 否;預設為 0 毫秒,或在 DOS 系統上為 2 秒

以下是使用不同選擇器的範例

<fileset dir="${ant.1.5}/src/main" includes="**/*.java">
    <different targetdir="${ant.1.4.1}/src/main"
        ignoreFileTimes="true"/>
</fileset>

比較 1.4.1 和 1.5 版本之間的所有 Java 原始檔,並選取不同的檔案,不考慮檔案時間。

檔案名稱選擇器

<filename> 標籤的作用類似於檔案集中 <include><exclude> 標籤。不過,透過使用選擇器,可以將其與所有其他選擇器結合,使用任何想要的 選擇器容器

<filename> 選擇器區分大小寫。

屬性 說明 必要
name 要選取的檔案名稱。name 參數可以包含標準的 Ant 萬用字元。 兩個參數中只有一個
regex 符合要選取檔案的正規表示式。
casesensitive 在查看檔案名稱時是否注意大小寫。 否;預設為 true
negate 是否反轉此檔案名稱選取的效果,因此模擬 exclude 標籤,而不是 include 標籤。 否;預設為 false

以下是使用檔案名稱選擇器的範例

<fileset dir="${doc.path}" includes="**/*">
    <filename name="**/*.css"/>
</fileset>

選取所有層疊樣式表檔案。

目前選擇器

<present> 標籤選取在另一個目錄樹中具有等效檔案的檔案。

<present> 標籤支援使用包含的 <mapper> 元素來定義要測試的檔案位置。如果未指定 <mapper> 元素,則使用 identity 類型對應器。

<present> 選擇器區分大小寫。

屬性 說明 必要
targetdir 尋找要與之比較檔案的基本目錄。精確位置取決於此屬性與 <mapper> 元素(如果有的話)的組合。
present 我們是否要求檔案僅存在於來源目錄樹中,或同時存在於來源和目標目錄樹中。有效值為
  • srconly—僅在檔案位於來源目錄樹中,但不在目標目錄樹中時選取檔案
  • both-- 僅在檔案同時存在於來源和目標目錄樹中時選取檔案
將此屬性設定為 srconly 等於將選擇器包覆在 <not> 選擇器容器中。
否;預設為 both

以下是使用目前選擇器的方法範例

<fileset dir="${ant.1.5}/src/main" includes="**/*.java">
    <present present="srconly" targetdir="${ant.1.4.1}/src/main"/>
</fileset>

選取 1.5 版中所有新的 Java 原始檔。

正規表示式選擇器

FileSet 中的 <containsregexp> 標籤會將該檔案集定義的檔案限制為僅包含與 expression 屬性指定的正規表示式相符的內容。

<containsregexp> 選擇器可用作資源選擇器(請參閱 <restrict> 資源集合)。

屬性 說明 必要
expression 指定必須在每個檔案中相符為 true 的正規表示式
casesensitive 執行大小寫敏感比對。自 Ant 1.8.2 起 否;預設為 true
multiline 執行多行比對。自 Ant 1.8.2 起 否;預設為 false
singleline 這允許 . 與新行相符。SingleLine 不應與 multiline 混淆,SingleLine 是 perl 正規表示式術語,它對應於 Java 正規表示式中的 dotall。自 Ant 1.8.2 起 否;預設為 false

以下是使用正規表示式選擇器的方法範例

<fileset dir="${doc.path}" includes="*.txt">
    <containsregexp expression="[4-6]\.[0-9]"/>
</fileset>

選取所有與正規表示式相符的文字檔(包含 4、5 或 6,後面接一個句點和 0 到 9 的數字)。

大小選擇器

FileSet 中的 <size> 標籤會對 include 標籤指定的檔案設定限制,因此不符合選擇器指定的檔案大小限制的標籤將不會被選取。

屬性 說明 必要
value 應測試的檔案大小。
units value 屬性所表達的單位。當使用標準單字母 SI 標示,例如 kMG 時,會使用 1000 的倍數。如果您要使用 2 的次方單位,請使用 IEC 標準:Ki 表示 1024、Mi 表示 1048576,以此類推。預設為沒有單位,表示 value 屬性表達的是確切的位元組數。
何時 表示如何詮釋大小,是否要選取大於、小於或等於該值的檔案。此屬性的可接受值為
  • less—選取小於指定大小的檔案
  • more—選取大於指定大小的檔案
  • equal—選取大小完全相同的檔案
否;預設為 equal

以下是使用大小選擇器的範例

<fileset dir="${jar.path}">
  <patternset>
    <include name="**/*.jar"/>
  </patternset>
  <size value="4" units="Ki" when="more"/>
</fileset>

選取所有大於 4096 位元組的 JAR 檔案。

類型選擇器

<type> 標籤選取特定類型的檔案:目錄或一般檔案。

屬性 說明 必要
類型 應測試的檔案類型。可接受的值為
  • file—一般檔案
  • dir—目錄

以下是使用類型選擇器選取 ${src} 中僅目錄的範例

<fileset dir="${src}">
  <type type="dir"/>
</fileset>

類型選擇器通常與其他選擇器結合使用。例如,若要選取也存在於 template 目錄中的檔案,但避免選取空目錄,請使用

<fileset dir="${src}">
    <and>
        <present targetdir="template"/>
        <type type="file"/>
    </and>
</fileset>

已修改選擇器

<modified> 選擇器會計算檔案的值,將其與儲存在快取中的值進行比較,如果這兩個值不同,則選取該檔案。

由於此選擇器高度可設定,因此執行選取的順序為

  1. 取得檔案的絕對路徑
  2. 從設定的快取中取得快取值(絕對路徑為金鑰)
  3. 從設定的演算法取得新值
  4. 使用設定的比較器比較這兩個值
  5. 視需要更新快取
  6. 根據比較結果執行選取

比較、計算雜湊值和儲存是由特殊介面的實作完成。因此,它們可能會提供其他參數。

<modified> 選擇器可用作資源選擇器(請參閱 <restrict> ResourceCollection)。在這種情況下,它會將簡單的檔案資源對應到檔案並執行其工作。如果資源來自其他類型,<modified> 選擇器會嘗試(注意!)將內容複製到本地檔案以計算雜湊值。

如果來源資源不是檔案系統資源,已修改選擇器會將其下載到 暫存目錄

屬性 說明 必要
演算法 應使用的演算法類型。可接受的值為(進一步資訊請參閱後續說明)
  • hashvalue—雜湊值演算法
  • digest—摘要演算法
  • checksum—檢查總和演算法
  • lastmodified—上次修改演算法
否;預設為 digest
快取 應使用的快取類型。可接受的值為(進一步資訊請參閱後續說明)
  • propertyfile—屬性檔快取
否;預設為 propertyfile
比較器 應使用的比較器類型。可接受的值為
  • equal—等於比較器
  • rule—java.text.RuleBasedCollator (請參閱 註解 以了解限制)
否;預設為 equal
algorithmclass 自訂演算法實作的類別名稱。優先權低於 algorithm
cacheclass 自訂快取實作的類別名稱。優先權低於 cache
comparatorclass 自訂比較器實作的類別名稱。優先權低於 comparator
update 當值不同時,是否應更新快取?(布林值) 否;預設為 true
seldirs 是否應選取目錄?(布林值) 否;預設為 true
selres 是否應選取沒有 InputStream 因此無法檢查的資源?(布林值) 否;預設為 true。僅在用作 ResourceSelector 時才相關。
delayupdate 如果設為 true,快取的儲存將延遲到下一個已完成的 BuildEvent;任務完成、目標完成或建置完成,以先發生的為準。這是為了提升效能。如果設為 false,快取的儲存將在每次變更時發生。此屬性取決於 update 屬性。(布林值) 否;預設為 true
以巢狀元素指定參數

<modified> 選取器支援巢狀 <classpath> 元素,表示用於尋找自訂介面實作的 類似路徑的結構

<modified> 選取器的所有屬性都可以使用巢狀 <param/> 標籤設定。可以根據下列規則使用 <param/> 標籤設定其他值。

演算法

algorithm 屬性相同,並具有下列其他值

名稱 說明
hashvalue 將檔案的內容讀取到 java.lang.String 中,並使用該 hashValue()。不需要其他設定。
digest 使用 java.security.MessageDigest。此演算法支援下列屬性
  • algorithm.algorithm (選用):摘要演算法的名稱 (例如 MD5SHA);預設為 MD5
  • algorithm.provider (選用):摘要提供者的名稱;預設為 null
checksum 使用 java.util.zip.Checksum。此演算法支援下列屬性
  • algorithm.algorithm (選用):演算法的名稱 (例如 CRCADLER);預設為 CRC)
lastmodified 使用檔案的 lastModified 屬性。不需要其他設定。
快取

cache 屬性相同,並具有下列其他值

名稱 說明
propertyfile 使用 java.util.Properties 類別及其載入和儲存到檔案的功能。此快取實作支援下列屬性
  • cache.cachefile (選用):屬性檔案的名稱;預設為 cache.properties
比較器

comparator 屬性相同。

algorithmclass

algorithmclass 屬性相同。

comparatorclass

comparatorclass 屬性相同。

cacheclass

cacheclass 屬性相同。

update

update 屬性相同。

seldirs

comparatorclass 屬性相同。

範例

以下是一些使用 Modified Selector 的範例

<copy todir="dest">
    <fileset dir="src">
        <modified/>
    </fileset>
</copy>

這會將所有檔案從 src 複製到 dest,其中內容已變更。使用更新的 PropertyfileCache 與 cache.properties 和 MD5-DigestAlgorithm。

<copy todir="dest">
    <fileset dir="src">
        <modified update="true"
                  seldirs="true"
                  cache="propertyfile"
                  algorithm="digest"
                  comparator="equal">
            <param name="cache.cachefile"     value="cache.properties"/>
            <param name="algorithm.algorithm" value="MD5"/>
        </modified>
    </fileset>
</copy>

這是相同的範例,改寫為 CoreSelector,設定所有值(與預設值相同)。

<copy todir="dest">
    <fileset dir="src">
        <custom class="org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector">
            <param name="update"     value="true"/>
            <param name="seldirs"    value="true"/>
            <param name="cache"      value="propertyfile"/>
            <param name="algorithm"  value="digest"/>
            <param name="comparator" value="equal"/>
            <param name="cache.cachefile"     value="cache.properties"/>
            <param name="algorithm.algorithm" value="MD5"/>
        </custom>
    </fileset>
</copy>

這是相同的範例,改寫為 CustomSelector。

<target name="generate-and-upload-site">
    <echo> generate the site using forrest </echo>
    <antcall target="site"/>

    <echo> upload the changed file </echo>
    <ftp server="${ftp.server}" userid="${ftp.user}" password="${ftp.pwd}">
        <fileset dir="htdocs/manual">
            <modified/>
        </fileset>
    </ftp>
</target>

在建置環境中,此選擇器對於首頁產生(例如使用 Apache Forrest)的實用場景。在此,所有已變更的檔案都會上傳到伺服器。因此,CacheSelector 可節省許多上傳時間。

<modified cacheclassname="com.mycompany.MyCache">
    <classpath>
        <pathelement location="lib/mycompany-antutil.jar"/>
    </classpath>
</modified>

使用 com.mycompany.MyCache,從 Ant 自己的類別路徑外部的 jar 檔案作為快取實作

關於 RuleBasedCollator 的注意事項

RuleBasedCollator 需要一種格式來執行其工作,但在建立實例時需要。初始化演算法在此情況下存在問題。因此,您不應使用此方法(或告訴我解決方法 :-)。

已簽署的選擇器

<signedselector> 標籤會選擇已簽署的檔案,並選擇性地選擇以特定名稱簽署的檔案。

自 Apache Ant 1.7 起

屬性 說明 必要
name 要檢查的簽章名稱。

可讀取選擇器

<readable> 選擇器只會選擇可讀取的檔案。Ant 只會呼叫 java.io.File#canRead,因此如果檔案不可讀取,但 JVM 無法偵測此狀態,此選擇器仍會選擇該檔案。

可寫入選擇器

<writable> 選擇器只會選擇可寫入的檔案。Ant 只會呼叫 java.io.File#canWrite,因此如果檔案不可寫入,但 JVM 無法偵測此狀態,此選擇器仍會選擇該檔案。

可執行選擇器

<executable> 選擇器只會選擇可執行的檔案。Ant 只會呼叫 java.nio.file.Files#isExecutable,因此如果檔案不可執行,但 JVM 無法偵測此狀態,此選擇器仍會選擇該檔案。

自 Ant 1.10.0 起

<symlink> 選擇器只會選擇為符號連結的檔案。Ant 只會呼叫 java.nio.file.Files#isSymbolicLink,因此如果檔案為符號連結,但 JVM 無法偵測此狀態,此選擇器將不會選擇該檔案。

自 Ant 1.10.0 起

OwnedBy 選擇器

<ownedBy> 選擇器僅選取由指定使用者擁有的檔案。Ant 僅呼叫 java.nio.file.Files#getOwner,因此如果檔案系統不支援此作業,此選擇器不會選取檔案。

自 Ant 1.10.0 起

屬性 說明 必要
擁有者 預期擁有者的使用者名稱
followsymlinks 選擇器是否必須追蹤符號連結?(另請參閱屬性如何與 FileSet 的對應屬性互動) 否;預設為 true

POSIX 群組選擇器

<posixGroup> 選擇器僅選取由指定 POSIX 群組擁有的檔案。Ant 僅呼叫 java.nio.file.Files#readAttributes,因此如果檔案系統不支援此作業或 POSIX 屬性,此選擇器不會選取檔案。

自 Ant 1.10.4 起

屬性 說明 必要
群組 POSIX 群組名稱
followsymlinks 選擇器是否必須追蹤符號連結?(另請參閱屬性如何與 FileSet 的對應屬性互動) 否;預設為 true

POSIX 權限選擇器

<posixPermissions> 選擇器僅選取具有指定 POSIX 權限的檔案。Ant 僅呼叫 java.nio.file.Files#getPosixFilePermissions,因此如果檔案系統不支援此作業,此選擇器不會選取檔案。

自 Ant 1.10.4 起

屬性 說明 必要
權限 POSIX 權限,格式為字串 (rwxrwxrwx) 或八進位 (777)
followsymlinks 選擇器是否必須追蹤符號連結?(另請參閱屬性如何與 FileSet 的對應屬性互動) 否;預設為 true

指令碼選擇器

<scriptselector> 元素讓您可以在任何 Apache BSFJSR 223 支援的語言中撰寫複雜的選取演算法。請參閱 Script 任務,以了解指令碼和相依性的說明。

自 Apache Ant 1.7 起

屬性 說明 必要
語言 指令碼的語言。
管理員 要使用的指令碼引擎管理員。請參閱 script 任務,以了解如何使用此屬性。 否;預設為 auto
src 指令碼的檔案名稱
encoding 指令碼的編碼,格式為檔案。自 Ant 1.10.2 起 否;預設為預設 JVM 字元編碼
setbeans 是否將所有屬性、參照和目標作為指令碼中的全域變數。 否;預設為 true
classpath 傳遞到指令碼的類別路徑。
classpathref 要使用的類別路徑,格式為對其他地方定義的路徑的 參照

此選擇器可以採用巢狀的 <classpath> 元素。請參閱 script 任務,以了解如何使用此元素。

如果未提供 src 屬性,則必須將指令碼巢狀在選擇器宣告內。

會針對每個測試呼叫嵌入式指令碼,其中 bean self 與選擇器繫結。它有一個屬性 selected,可以使用 setSelected(boolean) 設定,以選取檔案。

除了專案、屬性和目標的經典組之外,還會為每個指令碼設定下列 bean。

Bean 說明 類型
self 選擇器實例 org.apache.tools.ant.types.optional
filename 選取的檔案名稱 字串
file 選取的檔案 java.io.File
basedir 檔案集基本目錄 java.io.File

self bean 對應到選取器,它有下列屬性。只有 selected 旗標可寫入,其餘只能透過 getter 方法讀取。

屬性 說明 類型
selected 可寫入旗標,用於選取這個檔案 布林值
filename 選取的檔案名稱 字串
file 選取的檔案 java.io.File
basedir 檔案集基本目錄 java.io.File

範例

<scriptselector language="javascript">
  self.setSelected(true);
</scriptselector>

選取所有檔案。

<scriptselector language="javascript">
  self.setSelected((filename.length%2)==0);
</scriptselector>

選取檔案名稱長度為偶數的檔案。

選取器容器

若要建立更複雜的選取,可以使用各種包含其他選取器的選取器。它們會以各種方式結合其子選取器的選取。

選取器容器有

所有選取器容器都可以包含任何其他選取器(包括其他容器)作為元素。使用容器,選取器標籤可以任意深入。以下是容器中允許的選取器元素的完整清單

And 選取器

<and> 標籤會選取所有包含元素所選取的檔案。它會在找到未選取檔案的選取器後立即傳回,因此無法保證會檢查每個選取器。

以下是 And 選取器的使用範例

<fileset dir="${dist}" includes="**/*.jar">
    <and>
        <size value="4" units="Ki" when="more"/>
        <date datetime="01/01/2001 12:00 AM" when="before"/>
    </and>
</fileset>

選取所有大於 4096 位元組且自從上個千禧年以來未更新的 JAR 檔案。

Majority 選取器

<majority> 標籤會選取檔案,前提是大部分包含的元素也選取它。平手時,會依照 allowtie 屬性所指定的內容處理。

屬性 說明 必要
allowtie 如果選取檔案的選取器數量與未選取檔案的選取器數量相等,是否應該選取檔案。 否;預設為 true

以下是 Majority 選取器的使用範例

<fileset dir="${docs}" includes="**/*.html">
    <majority>
        <contains text="project" casesensitive="false"/>
        <contains text="taskdef" casesensitive="false"/>
        <contains text="IntrospectionHelper" casesensitive="true"/>
    </majority>
</fileset>

選取至少包含三個詞組 projecttaskdefIntrospectionHelper 中兩個的 HTML 檔案(最後一個詞組必須完全符合大小寫)。

None 選取器

<none> 標籤會選取所有包含元素未選取的檔案。它會在找到選取檔案的選取器後立即傳回,因此無法保證會檢查每個選取器。

以下是 None 選取器的使用範例

<fileset dir="${src}" includes="**/*.java">
    <none>
        <present targetdir="${dest}"/>
        <present targetdir="${dest}">
            <mapper type="glob" from="*.java" to="*.class"/>
        </present>
    </none>
</fileset>

只選取 .java 檔案,而 dest 目錄中沒有等效的 .java.class 檔案。

Not 選取器

<not> 標籤會反轉其包含的單一選取器的意義。

以下是 Not 選取器的使用範例

<fileset dir="${src}" includes="**/*.java">
    <not>
        <contains text="test"/>
    </not>
</fileset>

選取 src 目錄中不包含字串 test 的所有檔案。

Or 選取器

<or> 標籤會選取所有包含元素所選取的檔案。它會在找到選取檔案的選取器後立即傳回,因此無法保證會檢查每個選取器。

以下是 Or 選取器的使用範例

<fileset dir="${basedir}">
    <or>
        <depth max="0"/>
        <filename name="*.png"/>
        <filename name="*.gif"/>
        <filename name="*.jpg"/>
    </or>
</fileset>

選取頂層目錄中的所有檔案以及其下方的所有影像檔案。

選取器參考

<selector> 標籤用於建立可透過參考重複使用的選取器。它是唯一可以在任何目標之外使用的選取器,作為 <project> 標籤的元素。它只能包含一個其他選取器,但當然那個選取器可以是容器。

<selector> 標籤也可以根據 Ant 屬性是否存在有條件地選取檔案。此功能是使用 ifunless 屬性實現的,其使用方式與在目標或 <patternset> 中的 <include><exclude> 標籤上完全相同。

屬性 說明 必要
if 僅當已設定指定屬性時,允許選取檔案(請參閱)
unless 僅當設定指定屬性時,允許選取檔案(請參閱)

以下是 Selector Reference 使用範例

<project default="all" basedir="./ant">

    <selector id="completed">
        <none>
            <depend targetdir="build/classes">
                <mapper type="glob" from="*.java" to="*.class"/>
            </depend>
            <depend targetdir="docs/manual/api">
                <mapper type="glob" from="*.java" to="*.html"/>
            </depend>
        </none>
    </selector>

    <target>
        <zip>
            <fileset dir="src/main" includes="**/*.java">
                <selector refid="completed"/>
            </fileset>
        </zip>
    </target>

</project>

壓縮所有 java 檔案,這些檔案具有最新的等效類別檔案和 javadoc 檔案。

以下是根據屬性是否設定,有條件選取檔案的範例

<fileset dir="${working.copy}">
    <or>
        <selector if="include.tests">
            <filename name="**/*Test.class">
        </selector>
        <selector if="include.source">
            <and>
                <filename name="**/*.java">
                <not>
                    <selector unless="include.tests">
                        <filename name="**/*Test.java">
                    </selector>
                </not>
            </and>
        </selector>
    </or>
</fileset>

有條件包含 Java 來源檔案、測試來源檔案和類別檔案的檔案集。

自訂選擇器

您可以在 <custom> 標籤中指定自訂選擇器,並在選擇器容器中使用它們。

首先,您必須使用 Java 編寫您的選擇器類別。它必須符合的唯一條件是實作 org.apache.tools.ant.types.selectors.FileSelector 介面,其中包含一個方法。如需詳細資訊,請參閱 在 Ant 中編寫程式選擇器

撰寫完畢後,請使用 <custom> 標籤將它包含在您的建置檔案中。

屬性 說明 必要
classname 實作 org.apache.tools.ant.types.selectors.FileSelector 的類別名稱。
classpath 用於載入自訂選擇器類別的類別路徑。如果未指定 classpathclasspathref,將從 Ant 使用的類別路徑載入類別。
classpathref 先前已定義的類別路徑參考。如果未指定 classpathrefclasspath,將從 Ant 使用的類別路徑載入類別。

以下是使用 <custom> 將您的類別用作選擇器的範例

<fileset dir="${mydir}" includes="**/*">
    <custom classname="com.mydomain.MySelector">
        <param name="myattribute" value="myvalue"/>
    </custom>
</fileset>

也可以透過使用 <param> 元素指定其屬性,將許多核心選擇器用作自訂選擇器。這些選擇器包括

以下是深度選擇器區段的範例,已改寫為透過 <custom> 使用選擇器。

<fileset dir="${doc.path}" includes="**/*">
    <custom classname="org.apache.tools.ant.types.selectors.DepthSelector">
        <param name="max" value="1"/>
    </custom>
</fileset>

選取基礎目錄和其下一個目錄中的所有檔案。

如需撰寫自訂選擇器的詳細資訊,請參閱 在 Ant 中編寫程式選擇器