如何强制执行最终ant目标,而不考虑依赖关系



我有一个基本的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中成功双击它们。

相关内容

  • 没有找到相关文章

最新更新