所以,情况就是这样:我有一个定义编译任务的父构建文件,我希望子构建文件可以选择性地添加更多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)
这有效,但似乎很愚蠢,而且很难相信没有更好的方法.那更好的方法是什么?
我认为对此没有太多讨论,因此不存在这样的“惯例”。不过,文件集的工作方式排除了“王牌”包含物,因此
<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可以是文件集或文件列表(包括空文件列表),或任何其他基于文件的资源集合。
| 归档时间: |
|
| 查看次数: |
2127 次 |
| 最近记录: |