Ant

描述

在提供的构建文件上运行 Apache Ant。这可以用来构建子项目。此任务不能在target之外使用,如果它调用了它所属的同一个构建文件。

antfile属性被省略时,使用提供的目录(dir属性)中的build.xml文件。

如果没有提供目标属性,则使用新项目的默认目标。

默认情况下,当前项目的所有属性都将在新项目中可用。或者,您可以将inheritAll属性设置为false,并且只有“用户”属性(即在命令行上传递的属性)将传递给新项目。在这两种情况下,传递给新项目的属性集将覆盖在新项目中设置的属性(另请参见property任务)。

您还可以使用嵌套的property标签从旧项目中在新项目中设置属性。这些属性始终传递给新项目,以及在该项目中创建的任何项目,无论inheritAll的设置如何。这允许您参数化您的子项目。

当多个嵌套的<property>元素设置相同名称的属性时,最后声明的元素将获胜。这是为了向后兼容的原因,即使它与构建文件中<property>任务的行为方式不同。

命令行上定义的属性不能被嵌套的<property>元素覆盖。从 Ant 1.8.0 开始,嵌套的<ant>任务结构也是如此:如果构建文件A通过设置属性的嵌套<property>元素的<ant>任务调用B,而B包含调用C<ant>任务,C将看到在A中设置的值,即使B也使用了嵌套的<property>元素。

数据类型引用也可以传递给新项目,但默认情况下不会传递。如果您将inheritrefs属性设置为true,所有引用都将被复制,但它们不会覆盖在新项目中定义的引用。

嵌套的<reference>元素也可以用来将引用从调用项目复制到新项目,可以选择使用不同的id。从嵌套元素中获取的引用将覆盖在新项目中目标外部定义的现有引用,但不覆盖在目标内部定义的引用。

参数

属性 描述 必需
antfile 要使用的构建文件。此文件应为相对于给定的dir属性的相对文件名。 否;默认为build.xml
dir 用作新 Ant 项目的basedir的目录(除非useNativeBasedir设置为true)。这将覆盖被调用项目的basedir设置。
还用作解析antfileoutput属性值的目录(如果有)。
否;默认为当前项目的basedir,除非inheritall已设置为false,在这种情况下它没有默认值
target 应执行的新 Ant 项目的目标。 否;默认为新项目的默认目标
output 要将 Ant 输出写入的文件名。这相对于dir属性的值(如果已设置)或当前项目的basedir(否则)。
inheritAll 如果为true,则将所有属性传递给新的 Ant 项目。 否;默认为true
inheritRefs 如果为true,则将所有引用传递给新的 Ant 项目。 否;默认为false
useNativeBasedir 如果设置为true,子构建将使用与从命令行运行时相同的basedir(即查看子构建的构建文件时所期望的basedir)。从 Ant 1.8.0 开始 否;默认为false

作为嵌套元素指定的参数

property

参见property任务的描述。
这些属性等效于您在命令行上定义的属性。这些是特殊的属性,它们将始终被传递下去,即使通过额外的<*ant*>任务,即使inheritAll设置为false(见上文)。
请注意,refid属性指向调用项目中的引用,而不是新项目中的引用。

reference

用于选择要复制到新项目的引用,可以选择更改其id

属性 描述 必需
refid 调用项目中引用的id
torefid 新项目中引用的id 否;默认为refid的值

propertyset

从 Ant 1.6 开始.

您可以使用propertyset指定要复制到新项目的一组属性。

target

从 Ant 1.6.3 开始.

您可以使用嵌套的<target>元素指定多个目标,而不是使用target属性。这些将像 Ant 被调用时一样执行,其依赖项是如此指定的目标,按指定的顺序。

属性 描述 必需
name 调用的目标的名称。

新项目的 Basedir

如果您将useNativeBasedir设置为 true,新项目的basedir将是新项目<project>元素的basedir属性所说的任何内容(或者如果没有basedir属性,则为新项目的目录)——无论此任务的任何其他属性怎么说,也不管此任务嵌套到多少层<ant>调用中。

如果您没有设置useNativeBasedir或将其设置为false,则以下规则适用

新项目的basedir值受两个属性dirinheritall以及<ant>任务的历史记录的影响。当前的行为众所周知令人困惑,但不能在不以微妙的方式破坏向后兼容性的情况下更改。

如果<ant>任务位于“顶级”构建文件中,即包含<ant>任务的项目本身没有被调用为另一个<ant>(或<antcall>)任务的“更高”部分,则下表显示了详细信息

dir属性 inheritAll属性 新项目的basedir
提供的价值 真的 dir属性的值
提供的价值 错误的 dir属性的值
省略 真的 调用项目的basedir(其构建文件包含<ant>任务)。
省略 错误的 新项目<project>元素的basedir属性

另一方面,如果<ant>任务已经嵌套到另一个调用中,则父调用的设置会影响basedir值的最终结果。当前任务的dir属性将始终获胜,但如果dir属性被省略,则会出现更复杂的情况

dir属性 inheritAll属性 当前inheritAll属性 新项目的basedir
提供的价值 任何 任何 dir属性的值
省略 真的 真的 父项目的basedir(其构建文件调用包含当前<ant>任务的构建文件)。
省略 真的 错误的 父项目的basedir(其构建文件调用包含当前<ant>任务的构建文件)。
省略 错误的 真的 调用项目的basedir(其构建文件包含当前<ant>任务)。
省略 错误的 错误的 新项目<project>元素的basedir属性

如果您添加更深的嵌套级别,事情会变得更加复杂,您需要递归地应用上表。

如果最外层构建的basedir已在命令行上作为属性指定(即-Dbasedir=some-value-propertyfile参数),则提供的价值将获得更高的优先级。对于任何不指定dir属性的<ant>任务,新项目的basedir将是命令行上指定的值——无论任务嵌套到多少层构建文件中。

如果basedir作为<ant>任务的嵌套<property>指定,也会发生这种情况。在更深层级启动的构建文件的basedir将设置为属性元素的指定值,除非相应的 Ant 任务显式设置dir属性。

例子

这些是使用任务的不同方法

<ant antfile="subproject/subbuild.xml" target="compile"/>

<ant dir="subproject"/>

<ant antfile="subproject/property_based_subbuild.xml">
  <property name="param1" value="version 1.x"/>
  <property file="config/subproject/default.properties"/>
</ant>

<ant inheritAll="false" antfile="subproject/subbuild.xml">
  <property name="output.type" value="html"/>
</ant>

这些行调用同一个构建文件

<ant antfile="sub1/sub2/build.xml"/>
<ant antfile="sub2/build.xml" dir="sub1"/>
<ant antfile="build.xml" dir="sub1/sub2"/>

调用项目的构建文件定义了一些<path>元素,如下所示

<path id="path1">
    ...
</path>
<path id="path2">
    ...
</path>

被调用的构建文件(subbuild.xml)也定义了一个<path>,其idpath1,但path2未定义;然后

<ant antfile="subbuild.xml" inheritrefs="true"/>

不会覆盖subbuildpath1的定义,但会使父级对path2的定义在subbuild中可用,而

<ant antfile="subbuild.xml"/>

以及

<ant antfile="subbuild.xml" inheritrefs="false"/>

既不会覆盖path1也不会复制path2,而

<ant antfile="subbuild.xml" inheritrefs="false">
  <reference refid="path1"/>
</ant>

将覆盖subbuildpath1的定义,并且

<ant antfile="subbuild.xml" inheritrefs="false">
  <reference refid="path1" torefid="path2"/>
</ant>

将使用id path2将父级对path1的定义复制到新项目中。