資源

類檔案實體可以抽象成資源的概念。除了提供存取類檔案屬性的功能外,資源實作也應該在可能的情況下提供讀取內容和/或寫入內容到底層實體的方法。儘管資源的概念是在 Apache Ant 1.5.2 中引入的,但資源可供明確使用自 Ant 1.7 起

內建資源類型

內建資源類型為

resource

基本資源。其他資源類型衍生自此基本類型;因此所有屬性都可用,儘管在多數情況下不相關的屬性將會被忽略。此實作和所有資源實作也可以作為單一元素的資源集合使用。

屬性 說明 必要
name 此資源的名稱
exists 此資源是否存在 否;預設為 true
lastmodified 此資源的最後修改時間
directory 此資源是否為目錄類型 否;預設為 false
size 此資源的大小
refid 使此資源成為在其他地方定義的資源參考。如果指定,則不允許其他屬性或巢狀元素。

file

表示可透過本機檔案系統慣例存取的檔案。

屬性 說明 必要
file 此資源表示的檔案
basedir 此資源的基礎目錄。當設定此屬性時,嘗試存取資源的名稱會產生相對於此位置的路徑。
refid 使此檔案成為在其他地方定義的檔案參考。如果指定,則不允許其他屬性或巢狀元素。

javaresource

表示可透過 Java 類別載入器載入的資源。

屬性 說明 必要
name 資源的名稱。
classpath 在尋找資源時要使用的類別路徑。
classpathref 在尋找資源時要使用的類別路徑,以 參照 形式提供,指向其他地方定義的 <path>
loaderRef 用於載入資源的載入器名稱,由指定的類別路徑建構。
parentFirst 在使用巢狀類別路徑時,是否先諮詢父類別載入器,父類別載入器很可能是系統類別載入器。
自 Ant 1.8.0 起
否;預設為 true
refid 使這個 javaresource 成為 參照,指向其他地方定義的 javaresource。如果指定,不允許其他屬性或巢狀元素。

類別路徑也可以指定為巢狀類別路徑元素,其中 <classpath>類似路徑的結構

javaconstant

載入 Java 常數的值。作為 javaresource 的專門化,支援其所有屬性和巢狀元素。常數必須指定為 public static,否則無法載入。

屬性 說明 必要
name 資源的名稱。必須指定為完全限定的欄位名稱。
refid 使這個 javaconstant 成為 參照,指向其他地方定義的 javaconstant。如果指定,不允許其他屬性或巢狀元素。
範例

這會將 org.acme.Main 類別的常數 VERSION 的值載入到 version 屬性中。尋找該類別的類別路徑透過巢狀 classpath 元素提供。

<loadresource property="version">
  <javaconstant name="org.acme.Main.VERSION">
    <classpath>
      <pathelement location="${acme.lib.dir}"/>
    </classpath>
  </javaconstant>
</loadresource>

使用該常數的內容 (build.xml),建立一個新的檔案 c:/temp/org.apache.tools.ant.Main.DEFAULT_BUILD_FILENAME

<copy todir="c:/temp">
  <javaconstant name="org.apache.tools.ant.Main.DEFAULT_BUILD_FILENAME"/>
</copy>

zipentry

代表 ZIP 檔案中的項目。可以使用 archive 屬性或巢狀單一元素資源集合來指定檔案。zipentry 僅支援檔案系統資源作為巢狀元素。

屬性 說明 必要
zipfile 包含此資源的 zip 檔案 是,除非已指定巢狀資源集合
archive zipfile 的別名
name 已封存資源的名稱
encoding zip 檔案的編碼 否;預設為 JVM 預設字元編碼
refid 使這個 propertyresource 成為 參照,指向其他地方定義的 propertyresource。如果指定,不允許其他屬性或巢狀元素。

tarentry

代表 TAR 檔案中的項目。可以使用 archive 屬性或巢狀單一元素資源集合來指定檔案。

屬性 說明 必要
archive 包含此資源的 tar 檔案 是,除非已指定巢狀資源集合
name 已封存資源的名稱

gzipresource

這不是獨立資源,而是提供即時壓縮資源內容的包裝器。單一元素資源集合必須指定為巢狀元素。

bzip2resource

這不是獨立資源,而是提供即時壓縮資源內容的包裝器。單一元素資源集合必須指定為巢狀元素。

xzresource

這不是獨立資源,而是提供即時壓縮資源內容的包裝器。單一元素資源集合必須指定為巢狀元素。

XZ 壓縮支援已於 Apache Ant 1.10.1 之後新增,且依賴於未包含在 Ant 發行版中的外部函式庫。請參閱 函式庫依賴關係 以取得更多資訊。

url

代表 URL。

屬性 說明 必要
url 要公開的 URL 其中一個
file 要作為 file: URL 公開的檔案
baseUrl 必須與 relativePath 結合的基本 URL
relativePath baseUrl 結合時定義 URL 的相對路徑 如果使用 baseUrl
refid 使此 url 成為對其他地方定義的 url參考。如果指定,則不允許其他屬性或巢狀元素。

string

代表 Java 字串。可以寫入,但只能寫入一次,之後再次寫入將會產生錯誤。

屬性 說明 必要
value 此資源的值
refid 使此 string 成為對其他地方定義的 string參考。如果指定,則不允許其他屬性或巢狀元素。

資源也支援巢狀文字,前提是未設定 value 屬性

<string>
    self.log("Ant version =${ant.version}");
</string>

propertyresource

代表 Ant 屬性。

屬性 說明 必要
name 屬性名稱

資源集合

資源集合是將多個 資源 分組在一起的實體抽象。Ant 的幾個「舊版」資料類型已修改為資源集合行為

奇怪的是,某些任務甚至可以合理地表現為資源集合

其他內建資源集合

其他內建資源集合為

resources

一般資源集合,設計用於 references。例如,如果第三方 Ant 任務產生一個未知類型的資源集合,仍然可以使用 <resources> 集合來存取。這種集合類型的次要用途是作為其他資源集合的容器,保留巢狀集合的順序以及重複資源(與 union 相反)。

屬性 說明 必要
cache 是否快取結果。自 Ant 1.8.0 起 否;預設為 false
refid 讓這個 resourcecollection 成為對在其他地方定義的 resourcecollection參考。如果已指定,則不允許其他屬性或巢狀元素。

files

一組檔案。這些檔案會由從多個 PatternSets 取得的絕對模式來比對。這些模式可以指定為巢狀的 <patternset> 元素。此外,<files> 有一個隱含的 PatternSet,並直接支援 PatternSet 的巢狀 <include><includesfile><exclude><excludesfile> 元素,以及 PatternSet 的屬性。

檔案選擇器可用作巢狀元素。檔案必須由所有選擇器選取才能包含在內;因此,<files> 等同於 <and> 檔案選擇器容器。

簡單來說,此類型等同於沒有基本目錄的 fileset請注意,在沒有基本目錄的情況下,檔案系統掃描完全根據包含和排除模式進行。在基於模式選擇包含檔案後,檔案名稱(或任何)選擇器只能影響掃描程序。

屬性 說明 必要
包含 必須包含的檔案模式的逗號或空格分隔清單 至少包含其中一項
包含檔案 檔案名稱;此檔案的每一行都被視為包含模式。
排除 必須排除的檔案模式的逗號或空格分隔清單 否;如果 defaultexcludesno,則預設為預設排除或無
排除檔案 檔案名稱;此檔案的每一行都被視為排除模式。
預設排除 是否應使用 預設排除 否;預設為 true
區分大小寫 模式是否區分大小寫 否;預設為 true
refid 使此 files 成為對在其他地方定義的 files參考。如果已指定,則不允許其他屬性或巢狀元素。

限制

使用資源選擇器限制巢狀資源集合

屬性 說明 必要
cache 是否快取結果;停用可能會嚴重影響效能 否;預設為 true
refid 使此 restrict 成為對在其他地方定義的 restrict參考。如果已指定,則不允許其他屬性或巢狀元素。
指定為巢狀元素的參數

需要單一資源集合。

巢狀資源選擇器用於「縮小」包含的資源,並透過邏輯 AND 結合。這些選擇器仿照 檔案選擇器,但不出所料地針對資源。內部 antlib org.apache.tools.ant.types.resources.selectors 中有許多內建資源選擇器

name

依名稱選取資源。

屬性 說明 必要
name 使用標準 Ant 模式測試的名稱模式。 兩個中的其中一個
regex 用於選取檔案的正規表示式。
區分大小寫 名稱比較是否區分大小寫 否;預設為 true
handledirsep 如果指定此選項,則對應器會將資源名稱或名稱屬性中的 \ 字元視為 / 以進行比對。此屬性可以是 truefalse自 Ant 1.8.0 起 否;預設為 false
exists

選取現有資源。

date

依日期選取資源。

屬性 說明 必要
millis 自 1970 年 1 月 1 日起的毫秒數中的比較日期/時間 其中之一
datetime 格式化的比較日期/時間
pattern 使用當前地區設定與 datetime 屬性相容的 SimpleDateFormat 模式 否;預設為使用美國地區設定的 MM/dd/yyyy hh:mm a
granularity 比較檔案修改時間時使用的寬限毫秒數。這是必要的,因為並非每個檔案系統都支援追蹤毫秒等級的最後修改時間。 否;預設值因平台而異:FAT 檔案系統 = 2 秒;Unix = 1 秒;NTFS = 1 毫秒。
when 其中之一 beforeafterequal 否;預設 equal
type

依類型(檔案或目錄)選取資源。

屬性 說明 必要
type 其中之一 filedirany自 Ant 1.8 起
size

依大小選取資源。

屬性 說明 必要
size 要比較的檔案大小
when 其中之一 equaleqgreatergtlessltge(大於或等於)、ne(不等於)、le(小於或等於) 否;預設 equal
instanceof

依類型選取資源。

屬性 說明 必要
class 資源必須為其實例的類別 其中之一
type 必須可從資源指派的 Ant 類型
uri 必須在其中定義 type 的 URI
and

如果資源由所有巢狀資源選取器選取,則選取該資源。

or

如果資源由至少一個巢狀資源選取器選取,則選取該資源。

not

否定單一允許的巢狀資源選取器的選取結果。

none

如果資源未由任何巢狀資源選取器選取,則選取該資源。

majority

如果資源由多數巢狀資源選取器選取,則選取該資源。

屬性 說明 必要
allowtie 當巢狀資源選取器數量為偶數時,是否將平手視為多數 否;預設為 true
compare

根據資源與一個或多個「控制」資源的比較,使用巢狀 資源比較器 來選取資源。

屬性 說明 必要
when 比較 (equal/eqgreater/gtless/ltle(小於或等於)、ge(大於或等於)、ne(不等於)。 否;預設 equal
against 量詞 (all/each/everyany/some、(剛好)onemost/majoritynone 否;預設 all
指定為巢狀元素的參數

必須使用巢狀 <control> 元素(表示 resources 集合)來指定將針對其進行比較的資源。

範例

假設命名空間設定

rsel="antlib:org.apache.tools.ant.types.resources.selectors"
rcmp="antlib:org.apache.tools.ant.types.resources.comparators"
<restrict>
  <fileset dir="src" includes="a,b,c,d,e,f,g"/>
  <rsel:compare when="le" against="all">
    <control>
      <resource name="d"/>
    </control>
    <rcmp:name/>
  </rsel:compare>
</restrict>

選取檔案 abcd

<project rsel="antlib:org.apache.tools.ant.types.resources.selectors">
    <macrodef name="copyFromPath">
        <attribute name="todir"/>
        <attribute name="refid"/>
        <element name="nested-resource-selectors" optional="yes" implicit="true"/>
        <sequential>
            <mkdir dir="@{todir}" taskname="copyFromPath"/>
            <copy todir="@{todir}" taskname="copyFromPath">
                <restrict>
                    <path refid="@{refid}"/>
                    <rsel:or>
                        <nested-resource-selectors/>
                    </rsel:or>
                </restrict>
                <flattenmapper/>
            </copy>
        </sequential>
    </macrodef>
    <copyFromPath refid="classpath" todir="todir">
        <rsel:name name="log4j.properties"/>
        <rsel:name name="default.properties"/>
    </copyFromPath>
</project>

建立 todir 目錄,並從類別路徑(編譯時已使用)複製(如果存在)檔案 log4j.propertiesdefault.properties

<project>
    <filelist id="allfiles" dir="${ant.home}/bin" files="ant.cmd,foo.txt,ant.bat,bar.txt,ant"/>
    <restrict id="missingfiles">
        <filelist refid="allfiles"/>
        <rsel:not xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors">
            <rsel:exists/>
        </rsel:not>
    </restrict>
    <echo>These files are missed: ${toString:missingfiles}</echo>
</project>

資源集合 allfiles 定義預期的檔案清單。限制 missingfiles 使用 <not><exists> 選取器來取得所有不存在的檔案。最後,我們使用 toString: pathshortcut 以可讀形式取得它們:[echo] 遺失下列檔案:....foo.txt;....bar.txt

sort

根據資源的自然順序,或根據一個或多個巢狀 資源比較器,對巢狀資源集合進行排序

屬性 說明 必要
cache 是否快取結果;停用可能會嚴重影響效能 否;預設為 true
refid 將此 sort 設定為對其他地方定義的 sort參考。如果指定,則不允許其他屬性或巢狀元素。
指定為巢狀元素的參數

需要單一資源集合。

可透過指定一個或多個資源比較器來控制和自訂排序。資源可依據多個條件進行排序;最先指定的條件為「最外層」,最後指定的條件為「最內層」。內部 antlib org.apache.tools.ant.types.resources.comparators 中有數個內建資源比較器

資源比較器
name

依名稱排序資源。

exists

依存在與否排序資源。不存在視為「小於」存在。

date

依日期排序資源。

type

依類型(檔案或目錄)排序資源。由於目錄包含檔案,因此視為「大於」。

size

依大小排序資源。

content

依內容排序資源。

屬性 說明 必要
binary 是否應以二進位模式比較內容。如果為 false,則會不考慮特定於平台的行尾慣例來比較內容。 否;預設為 true
reverse

反轉自然排序順序,或單一巢狀比較器的順序。

範例
<property name="eol" value="${line.separator}"/>
<pathconvert property="sorted" pathsep="${eol}">
  <sort>
    <tokens>
      <string value="foo bar etc baz"/>
      <stringtokenizer/>
    </tokens>
  </sort>
</pathconvert>

字串 foo bar etc baz 類型的資源會由 stringtokenizer 切割成四個標記。這些標記會進行排序,而 sorted 會取得 bar baz etc foo 的值。

<sort>
  <fileset dir="foo"/>
  <reverse xmlns="antlib:org.apache.tools.ant.types.resources.comparators">
    <date/>
  </reverse>
</sort>

這會從 foo 取得所有檔案,並依反向修改日期排序。由於使用的資源比較器(<reverse><date>)位於內部 antlib 中,因此必須明確設定其命名空間。

first

包含巢狀資源集合中的前 count 個資源。這可搭配 sort 集合使用,例如從較大的集合中選取最舊、最大的等前幾個資源。

屬性 說明 必要
count 要包含的資源數量 否;預設 1
cache 是否快取結果;停用可能會嚴重影響效能 否;預設為 true
refid 使這個 first 成為其他地方定義的 first參考。如果指定,則不允許其他屬性或巢狀元素。
指定為巢狀元素的參數

需要單一資源集合。

last

自 Ant 1.7.1 起

包含巢狀資源集合中的最後 count 個資源。這可搭配 sort 集合使用,例如從較大的集合中選取最後幾個最舊、最大的等資源。

屬性 說明 必要
count 要包含的資源數量 否;預設 1
cache 是否快取結果;停用可能會嚴重影響效能 否;預設為 true
refid 使這個 last 成為其他地方定義的 last參考。如果指定,則不允許其他屬性或巢狀元素。
指定為巢狀元素的參數

需要單一資源集合。

allbutfirst

自 Ant 1.9.5 起

包含巢狀資源集合中除了前 count 項資源以外的所有元素。這可與 sort 集合搭配使用,例如從較大的集合中選取除了前幾個最舊、最大的等資源以外的所有資源。

屬性 說明 必要
count 要排除的資源數量 否;預設 1
cache 是否快取結果;停用可能會嚴重影響效能 否;預設為 true
refid 將此 allbutfirst 設為對在其他地方定義的 allbutfirst參照。如果指定,則不允許其他屬性或巢狀元素。
指定為巢狀元素的參數

需要單一資源集合。

allbutlast

自 Ant 1.9.5 起

包含巢狀資源集合中除了最後 count 項資源以外的所有元素。這可與 sort 集合搭配使用,例如從較大的集合中選取除了最後幾個最舊、最大的等資源以外的所有資源。

屬性 說明 必要
count 要排除的資源數量 否;預設 1
cache 是否快取結果;停用可能會嚴重影響效能 否;預設為 true
refid 將此 allbutlast 設為對在其他地方定義的 allbutlast參照。如果指定,則不允許其他屬性或巢狀元素。
指定為巢狀元素的參數

需要單一資源集合。

tokens

包含從巢狀資源集合收集的 字串 權杖。使用 TokenFilter 支援的相同權杖分析器。運用此資源集合的想像力,可以實作等同於 Unix 函數 sortgrep -cwcwc -l 的等效函數。

屬性 說明 必要
encoding 巢狀資源的編碼 否;預設為預設 JVM 字元編碼
cache 是否快取結果;停用可能會嚴重影響效能 否;預設為 true
refid 將此 tokens 設為對在其他地方定義的 tokens參照。如果指定,則不允許其他屬性或巢狀元素。
指定為巢狀元素的參數
範例
<concat>
  <union>
    <sort>
      <tokens>
        <resources refid="input"/>
        <linetokenizer includedelims="true"/>
      </tokens>
    </sort>
  </union>
</concat>

對資源集合 input 實作 Unix sort -u

集合運算

下列資源集合實作集合運算

union

巢狀資源集合的聯集。

唯一支援的屬性是 refid,它將此 union 設為對在其他地方定義的 union參照。如果指定,則不允許其他屬性或巢狀元素。

intersect

巢狀資源集合的交集。

唯一支援的屬性是 refid,它將此 intersect 設為對在其他地方定義的 intersect參照。如果指定,則不允許其他屬性或巢狀元素。

difference

巢狀資源集合的差集。

下列屬性適用於所有集合運算資源集合

屬性 說明 必要
cache 是否快取結果;停用可能會嚴重影響效能 否;預設為 true
refid 將此 difference 設為對在其他地方定義的 difference參照。如果指定,則不允許其他屬性或巢狀元素。
範例
<resources id="A">
    <string value="a"/>
    <string value="b"/>
</resources>
<resources id="B">
    <string value="b"/>
    <string value="c"/>
</resources>
<union id="union"><resources refid="A"/><resources refid="B"/></union>
<intersect id="intersect"><resources refid="A"/><resources refid="B"/></intersect>
<difference id="difference"><resources refid="A"/><resources refid="B"/></difference>
<echo>
  A: ${toString:A}                    = a;b
  B: ${toString:B}                    = b;c

  union     : ${toString:union}       = a;b;c
  intersect : ${toString:intersect}   = b
  difference: ${toString:difference}  = a;c
</echo>

mappedresources

自 Ant 1.8.0 起

包裝另一個資源集合,並使用 對應器 對應巢狀資源的名稱。

即使 mappedresources 封裝了由檔案系統為基礎的資源集合,mappedresources 也不會顯示為檔案系統為基礎。這表示您無法將 mappedresources 與僅允許檔案系統為基礎資源的任務一起使用。

指定為屬性的參數
屬性 說明 必要
cache 是否快取結果;啟用可能會改善效能。自 Ant 1.8.1 起 否;預設為 false
enablemultiplemappings 如果為 true,集合將使用給定來源路徑的所有對應。如果為 false,它將只處理第一個資源。自 Ant 1.8.1 起 否;預設為 false
refid 使此 mappedresources 成為對在其他地方定義的 mappedresources參考。如果指定,則不允許其他屬性或巢狀元素。
指定為巢狀元素的參數

需要單一資源集合。

可以使用單一 對應器 來對應名稱。如果未提供對應器(老實說,這沒有任何意義),則將使用身分對應器。

範例

將所有檔案從給定的目錄複製到目標目錄,並將 .bak 新增為副檔名。請注意,也可以直接將 對應器 巢狀到 複製 中來完成此操作。

<copy todir="${target}">
  <mappedresources>
    <fileset dir="${src}"/>
    <globmapper from="*" to="*.bak"/>
  </mappedresources>
</copy>

建立 WAR 檔案,將所有檔案形式的 CLASSPATH 項目新增到 WEB-INF/lib 目錄,而不保留其檔案系統結構。

<war destfile="${output}">
  <mappedresources>
    <restrict>
      <path path="${java.class.path}"/>
      <type type="file"/>
    </restrict>
    <chainedmapper>
      <flattenmapper/>
      <globmapper from="*" to="WEB-INF/lib/*"/>
    </chainedmapper>
  </mappedresources>
</war>

archives

自 Ant 1.8.0 起

此資源集合接受任意數量的巢狀資源,並假設所有這些資源都必須是 ZIP 或 TAR 檔案。<archives> 傳回的資源是巢狀檔案的內容。

此資源集合是 zipgroupfileset 的概化,而後者僅受 zip 系列任務支援。

唯一支援的屬性是 refid,它使此 archives 成為對在其他地方定義的 archives參考。如果指定,則不允許其他屬性或巢狀元素。

指定為巢狀元素的參數

<archives> 有兩個巢狀元素 <zips><tars>,它們本身是 聯集,即它們接受任意多個資源(集合)作為巢狀元素。

<zips> 的巢狀資源被視為 ZIP 檔案,<tars> 的巢狀資源被視為 TAR 檔案。

範例

將所有 jar 中的所有檔案(這些 jar 位於類別路徑上)複製到 ${target}

<copy todir="${target}">
  <archives>
    <zips>
      <restrict>
        <path path="${java.class.path}"/>
        <name name="*.jar"/>
      </restrict>
    </zips>
  </archives>
</copy>

resourcelist

自 Ant 1.8.0 起

此資源集合接受任意數量的巢狀資源,讀取這些資源並傳回每個讀取行的資源。

如果該行包含冒號,Ant 會嘗試將其用作 URL,如果失敗(或該行不包含冒號),則會傳回一個檔案資源,其名稱為該行的內容。

屬性會針對每一行展開。如果屬性展開產生資源物件,而不是字串(例如因為自訂屬性輔助程式),則會直接傳回資源。

<resourcelist><filelist> 的概化。

屬性 說明 必要
encoding 巢狀資源的編碼 否;預設為預設 JVM 字元編碼
basedir 用於解析相對檔案名稱的基本目錄。也用於提供此資源集合建立的 FileResources 的基本目錄。自 Ant 1.10.4 起
preserveduplicates 使這個 resourcelist 回傳所有資源,次數與它們被指定的次數相同。否則 resourcelist 只會回傳每個資源,順序為它們第一次出現的順序。自 Ant 1.10.10 起
refid 使這個 resourcelist 成為對在其他地方定義的 resourcelist參考。如果指定,則不允許其他屬性或巢狀元素。
指定為巢狀元素的參數

<resourcelist> 接受任意多個資源 (集合) 作為巢狀元素。

此外,<resourcelist> 支援巢狀 <filterchain> 元素,可用於在展開其行之前,過濾/修改已讀取的資源。此類巢狀元素對應於 filterchain

範例

以下範例會從幾個備用 URL 中的第一個實際可存取的 URL 複製一個檔案。它假設檔案 mirrors.txt 如下所示

    mirrors.txt:
https://best.mirror.example.org/
http://second.best.mirror.example.org/mirror/of/best/
https://yet.another.mirror/
https://the.original.site/
<copy todir="${target}">
  <first>
    <restrict>
      <resourcelist>
        <file file="mirrors.txt"/>
      </resourcelist>
      <exists/>
    </restrict>
  </first>
</copy>