在Ant中创建一个空的占位符文件集

时间:2012-01-26 19:16:41

标签: ant

所以,情况就是这样:我有一个定义编译任务的父构建文件,我希望子构建文件可以选择性地添加更多JAR(可以在任何地方)到该编译任务使用的类路径。 / p>

并非所有子构建文件都具有这些额外的依赖项,因此我不想强制它们定义其他依赖项文件集。它们应该只能包含父项,编译任务应该可以正常工作。

(显然还有其他必需的属性来配置源目录等等,但是他们没有进入这个。而且,实际的包含/继承问题有点复杂,但希望无论正确的是什么对于简单的案例也适用于复杂案例。)

我有一些有用的东西:父构建文件中的编译任务引用了额外的依赖文件集,无论如何:

<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>

这很有效,但似乎很愚蠢,而且很难相信没有更好的方法。那更好的方法是什么?

2 个答案:

答案 0 :(得分:3)

我认为对此没有太多讨论,因此不存在“惯例”。文件集的工作方式,排除'特朗普'包含,因此

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

应该始终为空。这似乎比占位符文件名技术和占位符目录名称以及erroronmissingdir方法稍微好一点。

出现问题的原因是,默认情况下,文件集的父目录下的所有文件都包含隐式包含。另一种选择 - 也许不是直接用于你的情况 - 是使用filelist代替。因为文件列表是由显式命名的文件构造的,所以如果你没有命名,则它们是空的。

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

通过推广,如果修改类路径以使用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

答案 1 :(得分:0)

在父构建文件中添加:

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

对于需要添加其他工件的子项,请在子构建文件中定义文件集:

<fileset id="additional.dependency.fileset" dir="..." includes="..." />
相关问题