Ant詳解之-path、classpath和fileset

賀滿發表於2015-01-04

轉自:http://www.cnblogs.com/itech/archive/2011/11/01/2231206.html

 

一 、<path/> 和 <classpath/>

你可以用":"和";"作為分隔符,指定類似PATH和CLASSPATH的引用。Ant會把分隔符轉換為當前系統所用的分隔符。

 當需要指定類似路徑的值時,可以使用巢狀元素。一般的形式是

<classpath>

  <pathelement path="{classpath}"/>

  <pathelement location="lib/helper.jar"/>

</classpath>

location屬性指定了相對於project基目錄的一個檔案和目錄,而path屬性接受逗號或分號分隔的一個位置列表。path屬性一般用作預定義的路徑,其他情況下,應該用多個location屬性。

 

為簡潔起見,classpath標籤支援自己的path和location屬性。所以:

<classpath>

  <pathelement path="{classpath}"/>

</classpath>

可以被簡寫作:

<classpath path="{classpath}"/>

 

也可通過<fileset>元素指定路徑。構成一個fileset的多個檔案加入path-like structure的順序是未定的。

<classpath>

  <pathelement path="{classpath}"/>

  <fileset dir="lib">

    <include name="**/*.jar"/>

  </fileset>

  <pathelement location="classes"/>

</classpath>

上面的例子構造了一個路徑值包括:{classpath}的路徑,跟著lib目錄下的所有jar檔案,接著是classes目錄。

  

如果你想在多個task中使用相同的path-like structure,你可以用<path>元素定義他們(與target同級),然後通過id屬性引用。

path-like structure可能包括對另一個path-like structurede的引用(通過巢狀<path>元素):

<path id="base.path">

  <pathelement path="{classpath}"/>

  <fileset dir="lib">

    <include name="**/*.jar"/>

  </fileset>

  <pathelement location="classes"/>

</path>

<path id="tests.path">

  <path refid="base.path"/>

  <pathelement location="testclasses"/>

</path>

前面所提的關於<classpath>的簡潔寫法對於<path>也是有效的,如:

<path id="tests.path">

  <path refid="base.path"/>

  <pathelement location="testclasses"/>

</path>

可寫成:

<path id="base.path" path="{classpath}"/>

  

二、 fileset

1)FileSet是一組檔案,這些檔案可以在基目錄樹下找到且與指定的PatternSets和Selectors匹配。FileSet的結構類似於如下:

<fileset dir="${server.src}">
  <patternset/>
  <Selector/>
</fileset>

 

2)patternset一般用作FileSet的子元素,用來幫助篩選檔案。可以包含如下的子元素:include,exclude,includes,excludes,includesfile,excludesfile.

FileSet中隱式地包含了一個patternset元素,所以可以在FileSet中直接包含patterset中的元素,例如<include>, <includesfile>, <exclude> and <excludesfile> 。

如下的patternset包含std子目錄下的java檔案,如果professional定義的話還包含prof下的java檔案,但是不包含名字中包含Test的檔案。
<patternset id="sources">
  <include name="std/**/*.java"/>
  <include name="prof/**/*.java" if="professional"/>
  <exclude name="**/*Test*"/>
</patternset>

 

3)Selector一般用作FileSet的子元素,用來幫助篩選檔案。

常用的核心的selector有:
<contains>    - 用來選擇包含指定字串的檔案
<date>      - 用來選擇在某個特定時間前或後修改的檔案
<depend>     - Select files that have been modified more recently than equivalent files elsewhere
<depth>      - 用來選擇指定目錄深度的檔案
<different>     - Select files that are different from those elsewhere
<filename>     - 用來選擇檔名匹配特定模式的檔案。等價於include和exclude的patternset。
<present>      - 用來選擇在某個位置存在或不存在的檔案
<containsregexp> - 用來選擇匹配指定正規表示式的檔案
<size>        - 用來選擇比指定size大或小的檔案
<type>       - Select files that are either regular files or directories.
<modified>     - Select files if the return value of the configured algorithm is different from that stored in a cache.
<signedselector>   - Select files if they are signed, and optionally if they have a signature of a certain name.
<scriptselector>    - Use a BSF or JSR 223 scripting language to create your own selector
<readable>     - 選擇有readable屬性的檔案
<writable>      - 選擇有writable屬性的檔案

例如選擇包含script的所有的html檔案
<fileset dir="${doc.path}" includes="**/*.html">
  <contains text="script" casesensitive="no"/>
</fileset>

例如選擇所有在January1,2001前修改的JAR檔案
<fileset dir="${jar.path}" includes="**/*.jar">
  <date datetime="01/01/2001 12:00 AM" when="before"/>
</fileset>

例如選擇所有滿足正規表示式的txt檔案
<fileset dir="${doc.path}" includes="*.txt">
  <containsregexp expression="[4-6]\.[0-9]"/>
</fileset>

如下的selector與patternset等價:
<fileset dir="${server.src}" casesensitive="yes">
  <filename name="**/*.java"/>
  <not>
    <filename name="**/*Test*"/>
  </not>
</fileset>
等價於
<fileset dir="${server.src}" casesensitive="yes">
  <filename name="**/*.java"/>
  <filename name="**/*Test*" negate="true"/>
</fileset>
等價於
<fileset dir="${server.src}" casesensitive="yes">
  <include name="**/*.java"/>
  <exclude name="**/*Test*"/>
</fileset>


selector容器可以包含其他的selector,常用的selector容器有:
<and>
<contains>
<custom>
<date>
<depend>
<depth>
<filename>
<majority>
<none>
<not>
<or>
<present>
<selector>
<size>


例如選擇比4096bytes大且從上個millenium沒有更新的JAR檔案
<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>

 

相關文章