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

Dav*_*les 7 ant

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

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

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

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

<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>
Run Code Online (Sandbox Code Playgroud)

...并且父构建文件还有一个创建此文件集的任务,为空,以便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>
Run Code Online (Sandbox Code Playgroud)

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

mar*_*ton 4

我认为对此没有太多讨论,因此不存在这样的“惯例”。不过,文件集的工作方式排除了“王牌”包含物,因此

<fileset refid="additional.dependency.fileset" dir="." excludes="**" />
Run Code Online (Sandbox Code Playgroud)

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

出现此问题的原因是,默认情况下,隐式包含文件集父目录下的所有文件。另一种选择 - 也许在您的情况下不直接使用 - 是使用 afilelist代替。因为文件列表是由显式命名的文件构建的,所以如果您不命名任何文件,它们就是空的。

<filelist id="additional.dependency.filelist" />
Run Code Online (Sandbox Code Playgroud)

通过概括,如果您修改类路径以使用以下内容,则可以混合文件集和文件列表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>
Run Code Online (Sandbox Code Playgroud)

引用additional.dependency.resources可以是文件集或文件列表(包括空文件列表),或任何其他基于文件的资源集合