1.ANT介绍
1.1 什么是Ant?
Apache Ant 是一个将软件编译、测试、部署等步骤联系在一起加以优化的一个构建工具,常用于Java 环境中的软件开发。
Ant 的默认配置文件是build.xml。
1.2 什么是构建?
形象的说,构建就是把代码从某个地方拿来、编译、再拷贝到某个地方去等操作,当然不仅于此,但是主要用来干这个。
1.3Ant 的优势?
(1)跨平台:因为 ant 是使用 java 实现的,所以跨平台;
(2)使用简单:比其他构建工具简单,特别是和 ant 的兄弟 make 做比较;
(3)语法清晰:同样是和 make 做比较;
(4)功能强大:Ant 能做的事情很多,可能你用了很久,你仍然不知道它能有多少功能。当你需要自己开发一些 ant 插件的时候,你会发现它更多的功能。
Ant 于Make 的区别:make 是一个类似于Ant 的构建工具,不过make 应用于C/C++,Ant 则主要应用于java。当然这不是定的,当大部分人如此。
2. 自己写的一个例子。
2.1 首先你建个java 项目。就写个Hello ant的小代码就可以了~,这就不说了。
然后在写一个build.xml文件。具体内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- (1) 建一个src 文件夹,然后写一个HelloWorld.java,按照包结构目录放进去; (2) 写build.xml 文件 (3) 在命令行输入 cmd, ant 做测试。 --> <project name="Ant_Testing" default="run" basedir="."> <property name="src" value="src"/> <property name="dest" value="classes"/> <property name="hello_jar" value="hello.jar"/> <target name="init"> <mkdir dir="${dest}"/> </target> <target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}"/> </target> <!-- 打jar 包 --> <target name="jar" depends="compile"> <jar destfile="${hello_jar}" basedir="${dest}"></jar> </target> <!-- 运行jar 包内的程序--> <target name="run" depends="jar"> <java classname="ant.HelloAnt" classpath="${hello_jar}"/> </target> <!-- 删除生成文件--> <target name="clean"> <delete dir="${dest}"/> <delete file="${hello_jar}"/> </target> <!-- 再次运行,这里显示了如何在一个 target 里边调用其他的 target --> <target name="return" depends="clean,run"> <ant target="clean"/> <ant target="run"/> </target> </project>
ant 中的每一个任务都可以这样执行,ant + target name
3.核心概念详解
3.1 project 属性
Attribute | Description | Required |
name | 项目名称,可自由定义。 | 否 |
default | 定义一个缺省(默认)的target,当我们执行没有指定 target 的build.xml 时,就会执行这个缺省的target。 |
是 |
basedir | 用于定义项目的基路径。 | 否 |
description | 表示项目的描述 | 否 |
一个项目可以有很多的property。可以在buildfile 中用property task 来设定,或者在ant 之外设定。一个property 有一个名字和一个值。Property 可以用于task 的属性值。这是通过将属性名放在“${}”之间并放在属性值的位置来实现的。例如有一个property builddir 的值是“build”,这
个property 就可用于属性值:${builddir}/classes。这个值就可被解析为 build/class。
典型的如第一讲中的例子,
首先设定property:
<property name="src" value="src" />
<property name="dest" value="classes" />
然后在其他地方引用property:
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${dest}" />
</target>
3.3 内置属性
除了Java 的内置属性外,Ant 还定义了一些自己的内置属性:
Attribute | Description |
basedir | 可以理解为project 项目的绝对路径,于<project>中的 basedir 属性一样 |
ant.file | buildfile 的绝对路径 |
ant.version | ant 的版本 |
ant.propertie.name | 当前执行的project 的名字,由<project>的name 属性设定 |
ant.java.version | ant 检测到的jvm 版本。 |
3.4 target 属性
Attribute | Description | Required |
name | target 的名字。 | 是 |
depends | 用逗号分隔的target 的名字列表,也就是依赖列表 | 否 |
if | 执行target 需要清除设定的属性名 | 否 |
unless | 执行target 需要清除设定的属性名 | 否 |
description | 描述target 的功能,这些描述可由-projexthelp 命令行 输出。 |
否 |
3.4.1
depends
target 中的depends 属性指定了target 的执行顺序,也就是说一个target 可以依赖其他的target。Ant 会依照depends 属性中的target 出现顺序依次执行每个target。在执行前,首先需要执行它所依赖的target。例如,有一个用于编译的target,一个用于生成执行文件的target。在生成执行文件之前必须先编译通过,所以生成可执行文件的target 依赖于编译target。Ant 会处理这种依赖关系。我们还要注意到,Ant 的depends 属性只指定了target应该被执行的顺序。如果被依赖的target无法运行,这种 depends 对于指定了依赖关系的其他target 没有影响。Ant 会依照depends 属性中target 出现的顺序依次执行每个target。然而,要记住的是只要某个target 依赖于一个target,后者就会被先执行。看下面的例子。
<target name="A"/> <target name="B" depends="A"/> <target name="C" depends="B"/> <target name="D" depends="C "/> |
假设我们默认的target 是D,因为D 依赖于C, C 依赖于B,B 依赖于A。所以先执行A,再执 行B,然后是C,最后D 被执行。 |
2.4.2 if / unless
如果执行某个target,由某些属性是否被设定来决定。这样,就能根据系统的状态(java version,OS, 命令行属性定义等等)来更好的控制build 的过程。要想让一个target 这样做,你就应该在target元素中,加入if 或unless 属性,带上target 应该有所判断的属性。看下面的例子。
<target name="install-windows" if="osfamily-windows"> <target name="install-unix" if="osfamily-unix"> |
一个task 是一段可执行的代码。task 可以有多个属性(也可以叫变量)。属性值可能包含对property 的引用。这些应用会在task 执行前被解析。
<target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}" /> </target> 其中的<javac srcdir="${src}" destdir="${dest}" /> 就是一个task。 其中的 ${src} 就是对前面定义的property 的引用。再执行javac 之前这些${*} 会被解析。 |
另外,我们可以使用内置的task 和一些可选的task,我们也可以编写自己的task。