2009-11-24 122 views
1

我繼承包含很多這樣的資源 集定義Ant構建系統:ANT:強制缺少資源時出錯?

<files id="app1.lib.jars"> 
    <include name="${java}/jre/lib/jsse.jar"/> 
    <include name="${work.lib}/jtidy.jar"/> 
    ... 
</files> 

<files id="app2.lib.jars"> 
    <include name="${work.lib}/itext.jar"/> 
    <include name="${work.lib}/commons-httpclient.jar"/> 
    ... 
</files> 

<files id="app3.lib.jars"> 
    <include name="${work.lib}/jdom.jar"/> 
    <include name="${ant.lib}/ant.jar"/> 
    ... 
</files> 

有可能這些十幾個,每個人都可以從 5至50個文件包含的任何地方。問題是我正在修改此係統以使用 Ivy進行依賴關係管理,並且在此過程中,一些 引用現在指向不存在的文件。不幸的是,螞蟻 沒有提供任何幫助找到這些壞指針。當使用這些資源 集合來定義類路徑時,任何<include...>標記 都將被忽略。

我想我可以通過使用集合作爲<copy...>的 源迫使一個錯誤,但即使failonerror="true"它只是 忽略壞的引用。

命令行-v(詳細)和-d(調試)選項也沒有幫助 。輸出承認,一些人失蹤,但沒有 實際顯示他們

[echo] app1.lib.jars 
[copy] C:\dev\src\tomcat6\work\java\jre\lib\jsse.jar omitted as C:\dev\src\tomcat6\work\verify\jsse.jar is up to date. 
[copy] C:\dev\src\tomcat6\work\lib\axis-ant.jar omitted as C:\dev\src\tomcat6\work\verify\axis-ant.jar is up to date. 
... 
[copy] No sources found. 
[echo] app2.lib.jars 
... 

對於我提取的所有文件名從Ant文件的 的資源集合一次性的解決方案相比,爲一個目錄列表 在適當的排序後,將所有文件(在Ant中)複製到臨時目錄 中。

問:有沒有辦法讓Ant在資源指向 指向缺少的文件時告訴我,最好是在定義資源時?

回答

4

下面是一種方法的說明。要點

  • 將您filesfilelists - 這些可以包含文件的名稱是不會在文件系統中存在,不像文件集和文件,即忽略條目不存在
  • 使用restrict到檢查是否存在
  • 使用fail時缺少的東西

錯誤您需要將增加「的antlib:org.apache.tools.ant.types.resources.selectors」命名的項目使用資源選擇器如下所示。你會碰到1.7.0以上的Ant版本。

<project name="so" default="checkfiles" basedir="." 
xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors"> 

<filelist id="app1.lib.jars"> 
    <file name="${java}/jre/lib/jsse.jar"/> 
    <file name="${work.lib}/jtidy.jar"/> 
    ... 
</filelist> 

<restrict id="missing.app1.lib.jars"> 
    <filelist refid="app1.lib.jars"/> 
    <rsel:not> 
    <rsel:exists/> 
    </rsel:not> 
</restrict> 

<property name="missing.files" refid="missing.app1.lib.jars" /> 
<fail message="These files are missing: ${missing.files}"> 
    <condition> 
    <length string="${missing.files}" when="greater" length="0" /> 
    </condition> 
</fail> 
<pathconvert property="found.files" refid="app1.lib.jars" /> 
<echo message="Found files ${found.files}" /> 

或者,您可以使用'copy'任務,正如您所建議的那樣,但使​​用文件列表而不是文件。 當它試圖處理不存在的第一個資源時,副本應該失敗。

+0

+1看起來很有趣。我明天會試試這個。 – 2009-11-25 03:11:46

+0

這個解決方案並不是最優的,因爲我更喜歡使用新的資源容器(我發現很奇怪文件列表和文件集沒有被重構爲子容器的子類)。我真正想要的是一個選項,它會告訴Ant爲缺少的文件發出警告,但看起來不可用。馬丁的回答看起來像是暫時完成這一任務的最佳方式。 – 2009-11-29 02:22:03