有没有办法让ant多次执行多个依赖目标。考虑一下:
<target name="buildall" depends="mycommon,myDAO" />
<target name="myCommon" depends="initCommon, clean, makedir, compile" description="">
<echo> Build completed for myCommon </echo>
</target>
<target name="myDAO" depends="initDAO, clean, makedir, compile" description="">
<echo> Build completed for myDao </echo>
</target>
我想buildAll调用myCommon,调用initCommon,clean,makedir,编译,然后调用myDAO调用initDAO,clean,makedire,编译。
所以我希望多次执行clean,makedir和compile任务。它们是通用的,基于initXXX任务中设置的属性运行。
我试过了:
<target name="buildall">
<antcall target="myCommon" />
<antcall target="myDao" />
</target>
但每次都会在任务之外运行一切,这不是我想要的。有什么想法吗?
答案 0 :(得分:7)
首先:不要使用<antcall/>
这通常表明你做错了。
现在,要了解Ant不是一种编程语言,您可以告诉Ant您想要做什么以及您希望它完成的顺序。 Ant是一种矩阵依赖语言。你只是告诉Ant你想要什么(我想建立这个jar),让Ant弄清楚它应该做什么。 Ant尽最大努力 不 多次运行目标。
例如,myCommon
和myDAO
都会调用clean
目标。 Ant正式指出,两者都需要clean
目标,然后在运行两个目标之前只调用clean
一次。这就是Ant假设工作的方式。
所以,让Ant做好自己的工作。首先,在正常情况下你不能清理。构建是为了最小化重建以加速任务。如果您尚未修改*.java
文件,为什么要强制我重建相应的*.class
文件?
第二:不要加倍依赖:例如,如果我想构建目标myDAO
,我想编译代码(可能构建一个jar或战争)。那是我myDAO
所有目标应该依赖的。现在,当我编译时,我可能需要创建我的目录,当我创建我的目录时,我可能需要执行我的init:
<target name="clean">
<echo>Clean up my working directory to be nice and sparkly</echo>
</target>
<target name="initDAO">
<echo>Initialize stuff for my DAO build</echo>
<echo>Maybe setup some properties?</echo>
</target>
<target name="makedir"
depends="initDAO">
<echo>I need my directories for building.</echo>
<echo>But first, I need to setup stuff"</echo>
</target>
<target name="compile"
depends="makedir">
<echo>I need to compile my dao source"</echo>
<echo>But first, I need to make the necessary directories</echo>
<target>
<target name="myDAO"
depends="compile">
<echo>Here's where I package up my DAO</echo>
<echo>But I have to compile stuff before I can package it</echo>
</target>
注意上述结构。如果我运行目标myDAO
,Ant将查看依赖项,然后运行initDAO
,makedir
,编译,最后myDAO
将所有内容打包。再一次,我有一个clean
目标,它将我的工作空间恢复到原始状态(在构建任何东西之前)条件,但我不会将其称为包的一部分,因为我不想重做工作。 / p>
<啊>“啊!”,你说,“但我必须清理,因为myCommon
和myDAO
使用相同的目录进行建筑和包装。”
好吧不要那样做。相反,请确保您的两个程序包使用不同的目标目录进行构建和打包。这样,您就不必将混乱清理干净。而且,您可以更改单个源文件,重建,而不必再次重新编译所有内容。
通过定义macros来处理两者之间的共同点,可以避免麻烦。例如,您可以定义一个编译宏,该编译宏将源目录的名称作为其参数,它将根据该源目录名创建一个destdir,并编译您的公共和DAO
目标。
所以,让Ant发挥其魔力。使用依赖关系不是告诉Ant如何做某事,而只是告诉Ant特定目标依赖于另一个目标。让Ant弄清楚执行的顺序。另外,不要将任务设置为要求您擦除目录并重新初始化所有内容。您希望Ant不必重建或重新复制未更改的文件,从而帮助最小化构建。