java - ant 依赖与 antcall

标签 java ant build-process build-automation

在定义顺序构建步骤时,我使用 target 元素的 depends 属性。我最近看到了一个 ant 文件,其中构建序列由目标内的 antcall 元素定义。 举例说明:

<target name="a" depends="b">
...</target>

<target name="a">
<antcall target="b"/>
...</target>

这两种方法有真正的区别吗?其中一个更可取吗?

最佳答案

最大的不同是Ant会保证通过depends声明的依赖被调用最多一次。例如:

<target name="a" />

<target name="b" depends="a" />

<target name="c" depends="a" />

<target name="d" depends="b, c" />

如果我调用目标 d,则调用 bc。然而,a 只被调用一次(即使 bc 都依赖它)。

现在假设我们决定使用 antcall 而不是依赖于目标 d:

<target name="d">
   <antcall target="b" />
   <antcall target="c" />
</target>

调用目标 d 现在将调用目标 bc;然而,目标 a 将被调用两次,一次用于 b,另一次用于 c

换句话说,antcall 回避了作为 Ant 基石的正常依赖规则。

我不认为应该使用 antcall 来替代普通的 Ant 类依赖项;这就是 depends 的用途。那么什么时候使用呢? antcall 任务确实允许您控制定义了哪些属性和引用(这就是创建新 Ant 环境的原因——以及它如此缓慢的原因),因此它可以用于创建相同的变体事物;例如,可能有两个 jar ,一个有调试符号,一个没有调试符号。

然而,过度使用 antcall 会产生缓慢、脆弱且难以维护的构建脚本。把它想象成 Ant 的 goto——它是邪恶的。大多数编写良好的构建脚本根本不需要它,除非在特殊情况下。

关于java - ant 依赖与 antcall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5936947/

相关文章:

c++ - 使用C++生成问题-C++/CLI-C#项目(Borland和VS特定组件)

java - 返回一个文本字符串作为 struts2 的响应

java - 如何让Java服务器读取变量而不是控制台输入?

java - 如何最好地在 EAR 中存储 Subversion 版本信息?

c++ - 在 cmake 中,cmake 文件夹和 CMakeLists.txt 可以放在不同的文件夹中吗?

visual-studio-2008 - 您可以在加载的项目上制作VC++解决方案集预处理器#defines吗?

java - JBoss 上未生成线程转储

java - 如何初始化数组列表中的对象

java - 无法将 maven 属性传递给 ant run 插件

tomcat - 使用 Ant 部署到 Geronimo