macrodef'd <jar>任务的行为不像隐式文件集?
使用标准的Ant 1.9.7来组装一堆jar文件。 我们已经制定了一个宏来帮助减少XML的冗长度:
<!-- All 'description' bits snipped for SO posting. -->
<macrodef name="buildjar">
... bunch of <attribute> ...
<element name="also"/>
<sequential>
<jar ....>
<manifest> ... </manifest>
<fileset what="stuff in every jar file" />
<fileset what="and this stuff too" />
<mappedresources if:true="beauty">
<fileset for when truth is beauty/>
<globmapper from="ugly" to="beauty"/>
</mappedresoruces>
<!-- Anything else for this specific jar. -->
<also/>
</jar>
</sequential>
</macrodef>
这工作:
<buildjar .........>
<also>
<fileset file="/some/path/somewhere/a_single_file"/>
</also>
</buildjar>
但是这并不是:
<buildjar .........>
<also>
<include name="/some/path/somewhere/a_single_file"/>
</also>
</buildjar>
没有错误。 查看ant -d
输出,根本没有提到附加条目,第一个示例中有一行fileset: Setup scanner in dir /some/path/somewhere with patternSet{ includes: [a_single_file] excludes: [] }
同上多个文件。 这工作:
<buildjar .........>
<also>
<fileset dir="/some/path/somewhere">
<include name="one_file" />
<include name="foo**" />
</fileset>
</also>
</buildjar>
但是这不:
<buildjar .........>
<also>
<include name="/some/path/somewhere/one_file"/>
<include name="/some/path/somewhere/foo**"/>
</also>
</buildjar>
根据<jar>
的Ant手册页面,
此任务形成一个隐式FileSet,并支持<fileset>(dir变成basedir)以及嵌套的<include> ,<exclude>和<patternset>元素的大多数属性。
所以理论上,不应该只<include>
一个<include>
,而应该成为宏的<jar>
的嵌套元素?
显然,在实践中这不是问题(我们在构建文件中打了一个bigass注释,告诉人们不要忽略显式的<fileset>
)。 而且我们不能像这样将<fileset>
放入宏定义中:
<macrodef name="buildjar">
<element name="also"/>
<sequential>
<jar ....>
.....
<!-- Anything else for this specific jar. -->
>> <fileset dir="some_generic_base_path">
<also/>
>> </fileset>
</jar>
</sequential>
</macrodef>
因为当调用代码做了buildjar
没有任何also
块,不受限制的文件集将包括整个some_generic_base_path
树。
这仅仅是宏指令和文件集之间的一些互动,让我们感到吃惊吗?
简短的回答是否定的 - 这不是一个macrodef问题。 要使用隐式文件集,必须为<jar>
任务指定basedir
属性。 这里有一个例子说明了这一点:
<jar destfile="my.jar">
<include name="a/b" />
</jar>
<zip destfile="my.zip" >
<include name="a/b" />
</zip>
在该示例中, <jar>
任务将成功并创建一个仅清单的jar文件。 但是<zip>
任务将失败地说:
BUILD FAILED
build.xml:8: basedir attribute must be set, or at least one resource collection must be given!
jar任务基于zip任务并继承对资源的检查。 因为jar任务有一些 - 清单 - 错误不会抛出。
如果您想使用隐式文件集,请指定一个basedir
。
上一篇: macrodef'd <jar> task not behaving like an implicit fileset?