2012-01-26 81 views
7

因此,情況如下:我有一個父級構建文件,它定義了一個編譯任務,我希望子構建文件可以選擇性地向類路徑添加更多的JAR(可能在任何地方)該編譯任務使用。在Ant中創建一個空的佔位符文件集

並非所有的子構建文件都具有這些附加的依賴關係,所以我不想強制它們定義附加的依賴關係文件集。他們應該能夠包含父項,並且編譯任務應該可以工作。 (顯然還有其他必需的屬性可以配置源目錄等等,但是它們不會涉及到這一點,而且,實際的包含/繼承問題稍微複雜一些,但希望無論什麼是正確的事情針對簡單的情況將在複雜的情況下工作太)

我有一些作品:在父生成文件的編譯任務指的是附加的依賴文件集,無論:

<target name="compile" depends="init-additional-dependencies"> 
    <fileset id="global.dependency.fileset" dir="${global.library.directory}"> 
    <include name="**/*.jar"/> 
    </fileset> 
    <javac ...> 
    <classpath> 
     <!-- should be the same for all buildfiles --> 
     <fileset refid="global.dependency.fileset"/> 

     <!-- should be populated by child buildfiles --> 
     <fileset refid="additional.dependency.fileset"/> 
    </classpath> 
    </javac> 
</target> 

...和父構建文件也有一個創建此文件集的任務,爲空,以便javac不會炸燬。不過,我創建空的文件集的方式是遲鈍的:

<target name="init-additional-dependencies"> 
    <!-- override me! --> 
    <fileset id="additional.dependency.fileset" dir="."> 
    <include name="placeholder.does.not.exist.so.fileset.is.empty"/> 
    </fileset> 
</target> 

這工作,但似乎啞巴,很難相信沒有一個更好的辦法。什麼是更好的方法?

+0

很有趣的問題+1 。麻煩是你的dirset使用「。」它始終存在。如果你在保留附加依賴jar的地方命名約定(比如./deps/),那麼你可以用'erroronmissingdir = false'創建dirset。 – Jayan

回答

3

我不認爲這方面有太多的討論,所以沒有「公約」這樣的存在。文件集的工作方式雖然排除「王牌」包含,因此

<fileset refid="additional.dependency.fileset" dir="." excludes="**" /> 

應該始終爲空。這對於佔位符文件名稱技術和佔位符目錄名稱以及erroronmissingdir方法來說似乎都稍微可取。

出現此問題的原因是,默認情況下,隱式包含文件集父目錄下的所有文件。另一種選擇 - 可能不是直接用於您的情況 - 是使用filelist代替。因爲文件列表是從明確命名的文件構建的,所以如果您不指定任何名稱,它們就是空的。

<filelist id="additional.dependency.filelist" /> 

通過要概括,你可以混合文件集的文件列表,如果你修改你的classpath使用resources

<filelist id="additional.dependency.resources" /> 

... 

<classpath> 
     <!-- should be the same for all buildfiles --> 
     <fileset refid="global.dependency.fileset"/> 

     <!-- should be populated by child buildfiles --> 
     <resources refid="additional.dependency.resources"/> 
</classpath> 

參考additional.dependency.resources可以是文件集或文件列表(包括空文件列表) ,或任何其他file-based resource collection

0

在父生成文件中加入:

<fileset id="additional.dependency.fileset" erroronmissingdir="false" dir="noop" /> 

對於需要更多的文物將被添加的孩子,定義子構建文件的文件集:

<fileset id="additional.dependency.fileset" dir="..." includes="..." /> 
相關問題