所以,情况就是这样:我有一个定义编译任务的父构建文件,我希望子构建文件可以选择性地添加更多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>
这很有效,但似乎很愚蠢,而且很难相信没有更好的方法。那更好的方法是什么?
答案 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="..." />