Ant目标
Ant目标是要执行以执行构建过程的一部分(或者全部)的一系列任务。 Ant目标是由Ant的用户定义的。因此,Ant目标包含的任务取决于Ant用户在构建脚本中尝试执行的操作。同样,Ant目标的名称也由Ant构建脚本的创建者决定。
一些更常见的Ant目标是:
clean
:用于清理构建输出目录的Ant目标-例如删除编译的类文件,删除生成的源代码,或者只是完全删除整个构建输出目录。- compile:用于在项目中编译Java源代码的Ant目标。
- jar:一个Ant目标,用于从已编译的类创建JAR文件。
- " test":一个Ant目标,用于运行Java代码的所有单元测试。
javadoc
:一个用于从Java代码创建JavaDoc注释的Ant目标。
并非每个项目都有确切的目标。如前所述,这取决于我们要对Ant构建脚本执行的操作。如果要编译Java代码,则可以,也许我们将具有与上述目标类似的目标。但是,如果我们正在做其他事情,例如将HTML页面添加到EPUB书中(本质上是一个内部包含XML和HTML文件的ZIP文件),那么构建脚本中很可能会有不同的Ant目标。
定义Ant目标(target)
我们可以使用target
元素定义一个Ant目标。这是一个Ant目标示例:
<project name="MyProject"> <target name="firstTarget"> </target> </project>
这个Ant目标示例定义了一个名为firstTarget
的目标。目标不包含任何任务,这意味着目标不执行任何操作。它只是一个空的目标定义。 target元素嵌套在project元素内部,作为project元素的直接子元素。
如果Ant构建脚本同时包含目标和属性,则通常(但不是必需)将属性在Ant构建脚本中的目标之前列出。这是同时具有Ant目标和Ant属性的Ant构建脚本的示例:
<project name="MyProject"> <property name="myProperty">theValue</property> <target name="firstTarget"> </target> </project>
向目标添加任务
要使Ant目标实际执行某项操作,我们必须向其中添加一些任务。 Ant附带了许多内置任务,可以完成所有事情,例如创建目录,复制文件,编译Java代码,生成JavaDoc,创建ZIP和JAR文件,通过SSH将文件上传到服务器,以及许多其他功能,许多其他任务。
在此示例中,我将使用一个名为echo
的简单Ant任务。 echo
任务只是将一条消息输出到命令提示符。有时在较大的内部版本中可能很有用,以提供已执行哪些内部版本工作状态的状态。这是一个内部带有echo
任务的Ant目标的示例:
<project name="MyProject"> <property name="version">1.2.3</property> <target name="firstTarget"> <echo>This is version ${version}</echo> </target> </project>
如果我们运行Ant目标firstTarget
,则将执行echo
任务。此处定义的echo
任务将在控制台输出消息" This is version 1.2.3"。注意在echo
元素主体中的$ {version}
属性引用。在打印消息之前,此引用代替了version
属性的值。这是Ant在运行" firstTarget"目标时输出的示例:
D:\data\projects\build-experiments>ant firstTarget Buildfile: D:\data\projects\build-experiments\build.xml firstTarget: [echo] This is version 1.2.3 BUILD SUCCESSFUL Total time: 1 second D:\data\projects\build-experiments>
当然,目录取决于Ant构建脚本位于何处,但是输出应与上面显示的相同(或者至少非常相似)。
我们将在此Ant教程的后续文章中看到更有用的任务的示例。
目标依赖
一个Ant目标可以依赖于其他目标。如果Ant目标B依赖于另一个目标A,则在目标A被执行之前,Ant不会执行目标B。如果我们指示Ant执行目标B,则Ant将首先执行目标A,然后再执行目标B。
目标依赖关系对于确保在执行另一个目标之前已经执行了一个目标很有用。例如,compile
目标先于jar
目标执行,因为如果Java源代码没有首先编译,则生成JAR文件可能没有意义。
Ant目标所依赖的目标列在target元素的depends属性内。这是具有依赖性的示例目标:
<project name="MyProject"> <target name="A"> <echo>Target A</echo> </target> <target name="B" depends="A"> <echo>Target B</echo> </target> </project>
注意目标B如何具有一个`depends'属性,其中包含目标A的名称。
如果一个目标需要依赖多个其他目标,则在depends
属性内列出所有目标名称,并用逗号分隔。这是多个目标依赖项的示例:
<project name="MyProject"> <target name="A"> <echo>Target A</echo> </target> <target name="B" > <echo>Target B</echo> </target> <target name="C" depends="A, B"> <echo>Target B</echo> </target> </project>
注意目标C如何同时依赖目标A和目标B。
如果一个目标在整个依赖链中被多次列出,那么它仍然只会被执行一次。在以下示例中,目标C取决于目标A和B,目标B也取决于目标A。但是即使目标A在目标依赖项中列出两次,目标A也只会执行一次,而不是两次。
<project name="MyProject"> <target name="A"> <echo>Target A</echo> </target> <target name="B" depends="A"> <echo>Target B</echo> </target> <target name="C" depends="A, B"> <echo>Target B</echo> </target> </project>