自 Apache Ant 1.6 起
调用所有定义的子构建的给定目标。这是 Ant 用于批量项目执行的扩展。此任务不能在target
之外使用,如果它调用了它所属的同一个构建文件。
subant
在内部使用 ant
,因此 ant
的手册页 中提到的许多内容也适用于此。
subant
可以与目录集一起使用,以从不同的目录执行构建。提供了 2 种不同的选项
subant
任务不会为你设置基目录,因为你可以在每个构建文件中指定它。属性 | 描述 | 类型 | 必需 |
---|---|---|---|
antfile | 构建文件名,与目录一起使用。 | 字符串 | 否;默认为 build.xml,如果设置了 genericantfile,则忽略 |
buildpath | 设置用于查找子项目的构建路径。 | 路径 | 否 |
buildpathref | 要使用的构建路径,通过引用。 | 引用 | |
failonerror | 设置是否在错误时使用构建异常失败,或者继续。 | 布尔值 | |
genericantfile | 构建文件路径,与目录一起使用。 使用 genericantfile,以便使用不同的 basedir 运行同一个构建文件。 如果设置了此属性,则忽略 antfile。 |
文件 | |
inheritall | 对应于 <ant> 的 inheritall 属性,但在此任务中默认为 false。 |
布尔值 | |
inheritrefs | 对应于 <ant> 的 inheritrefs 属性。 |
布尔值 | |
output | 对应于 <ant> 的 output 属性。 |
字符串 | |
target | 字符串 | ||
verbose | 启用/禁用显示每个子构建路径何时进入/退出时的日志消息。 | 布尔值 | 否;默认值为 false |
这包括 <fileset>
、<dirset>
和 <filelist>
,它们是 Ant 1.7 之前支持的嵌套资源集合。
请注意,目录将以不确定的顺序添加到构建路径,因此如果顺序很重要,则应使用文件列表!
将有序文件列表添加到隐式构建路径。
请注意,与文件和目录集相反,文件列表可以引用不存在的文件或目录!
将文件集添加到隐式构建路径。
请注意,目录将以不确定的顺序添加到构建路径,因此如果顺序很重要,则应使用文件列表!
对应于 <ant>
的嵌套 <property>
元素。
当多个嵌套的 <property>
元素设置相同名称的属性时,最后声明的元素将获胜。这是出于向后兼容性的原因,即使它与构建文件中 <property>
任务的行为方式不同。
对应于 <ant>
的嵌套 <propertyset>
元素。
创建一个嵌套构建路径,并将其添加到隐式构建路径。
创建一个嵌套的 <buildpathelement>
,并将其添加到隐式构建路径。
自 Ant 1.7 起.
你可以使用嵌套的 <target>
元素指定多个目标,而不是使用 target 属性。这些将被执行,就好像 Ant 被调用了一个目标,该目标的依赖项是如此指定的目标,按指定的顺序。
属性 | 描述 | 必需 |
---|---|---|
name | 调用的目标的名称。 | 是 |
此代码段构建文件将在项目目录的每个子目录中运行 ant,其中可以找到名为 build.xml 的文件。属性 build.dir
将在 subant
调用的 Ant 项目中具有值 subant1.build
。
<project name="subant" default="subant1"> <property name="build.dir" value="subant.build"/> <target name="subant1"> <subant target=""> <property name="build.dir" value="subant1.build"/> <property name="not.overloaded" value="not.overloaded"/> <fileset dir="." includes="*/build.xml"/> </subant> </target> </project>
此代码段构建文件将在项目目录的每个子目录中运行 ant,其中可以找到名为 build.xml 的文件。所有名称以 foo
开头的属性都将被传递,它们的名称将更改为以 bar
开头。
<subant target=""> <propertyset> <propertyref prefix="toplevel"/> <mapper type="glob" from="foo*" to="bar*"/> </propertyset> <fileset dir="." includes="*/build.xml"/> </subant>
假设项目目录的子目录名为 projects1、projects2、projects3,此代码段将执行 /opt/project/build1.xml 的 compile
目标,将 basedir 设置为 projects1
、projects2
、projects3
<subant target="compile" genericantfile="/opt/project/build1.xml"> <dirset dir="." includes="projects*"/> </subant>
现在是一个更复杂但有用的场景。假设我们有这样的目录结构
root | common.xml | build.xml | +-- modules +-- modA | +-- src +-- modB +-- src common.xml:
<project> <property name="src.dir" value="src"/> <property name="build.dir" value="build"/> <property name="classes.dir" value="${build.dir}/classes"/> <target name="compile"> <mkdir dir="${classes.dir}"/> <javac srcdir="${src.dir}" destdir="${classes.dir}"/> </target> <!-- more targets --> </project> build.xml:
<project> <macrodef name="iterate"> <attribute name="target"/> <sequential> <subant target="@{target}"> <fileset dir="modules" includes="*/build.xml"/> </subant> </sequential> </macrodef> <target name="compile"> <iterate target="compile"/> </target> <!-- more targets --> </project> modules/modA/build.xml:
<project name="modA"> <import file="../../common.xml"/> </project>
这导致模块中的构建文件非常小,可维护的构建文件 (common.xml) 和清晰的项目结构。此外,根构建文件能够对所有模块运行整个构建。
此任务对每个子项目执行 clean build
。
<subant failonerror="false"> <fileset dir="." includes="**/build.xml" excludes="build.xml"/> <target name="clean"/> <target name="build"/> </subant>
提示:因为构建文件是纯 XML,所以你可以使用 XSLT 转换从公共构建文件生成主构建文件
<xslt in="common.xml" out="master.xml" style="${ant.home}/etc/common2master.xsl"/>