我有一个基本的ant脚本,在其中我将一组文件复制到任何目标之外的目录中。然后,我想在任何/所有目标运行后清理这些文件,而不管依赖关系如何。我遇到的主要问题是目标可以是'compile'或'deploywar',所以我不能只是盲目地从'compile'调用'cleanUp'目标,因为'deploywar'可能接下来被调用。我不能盲目地从'deploywar'调用,因为它可能不会被调用。如何定义一个在所有其他必要的目标完成(失败或成功)后调用的目标?下面的'cleanUpLib'目标是我想在所有/任何任务执行后调用的目标:
<project name="proto" basedir=".." default="deploywar">
...
<copy todir="${web.dir}/WEB-INF/lib">
<fileset dir="${web.dir}/WEB-INF/lib/common"/>
</copy>
<target name="compile">
<!-- Uses ${web.dir}/WEB-INF/lib -->
....
</target>
<target name="clean" description="Clean output directories">
<!-- Does not use ${web.dir}/WEB-INF/lib -->
....
</target>
<target name="deploywar" depends="compile">
<!-- Uses ${web.dir}/WEB-INF/lib -->
....
</target>
<target name="cleanUpLib">
<!-- Clean up temporary lib files. -->
<delete>
<fileset dir="${web.dir}/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
</delete>
</target>
要在任何/所有目标之后运行目标,而不考虑依赖关系,您可以使用构建侦听器或一些try/catch/finally模式,详细信息请参见:
- https://stackoverflow.com/a/6391165/130683
- https://stackoverflow.com/a/1375833/130683
Rebse指出的构建侦听器解决方案看起来很有用(+1)。
你可以考虑的另一种选择是"重载"你的目标,就像这样:
<project default="compile">
<target name="compile" depends="-compile, cleanUpLib"
description="compile and cleanup"/>
<target name="-compile">
<!--
your original compile target
-->
</target>
<target name="deploywar" depends="-deploywar, cleanUpLib"
description="deploywar and cleanup"/>
<target name="-deploywar">
<!--
your original deploywar target
-->
</target>
<target name="cleanUpLib">
</target>
</project>
当然,您不能在单个Ant构建文件中真正重载,因此目标名称必须不同。
(我在上面使用了"-"前缀,这是一种使目标"私有"的hack -即,由于shell脚本参数处理,您不能从命令行调用它们。当然,你仍然可以在Ant中成功双击它们。