我有一个基本的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>
答案 0 :(得分:2)
要在任何/所有目标之后运行目标而不考虑依赖关系,您可以使用构建侦听器或一些try / catch / finally模式,有关详细信息,请参阅:
答案 1 :(得分:2)
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脚本arg处理你无法从命令行调用它们。但当然你仍然可以加倍 - 在Ant中成功点击它们。