在任何稳固的软件工程项目里,构建工具都是开发人员工具包里最重要的一个部件之一。没有一个可靠的构建工具,编译、包装和发布过程都会从复杂性和时间需求等方面影响实际的编程过程。
用于Java开发人员的构建工具选择一直被局限于原有的基于UNIX的工具,例如Make。Make及其开放源代码的派生工具能够完成任务,但是正式严肃的工作常常还是要依赖于调用UNIX或者Windows命令来完成。这就意味着,Java代码即使能够做到跨平台和编写一次就能各处使用,构建系统一般还是只能依赖于某种特定的平台。
Java开发人员看到了这个问题,并意识到:通过提升Java平台的功能,他们能够创建一个更加强大的构建工具,这个工具是专门为Java程序人员设计的,而且不会依赖于任何特定的平台。这就是Ant,一个由Apache基金会的Jakarta项目所管理的项目。
Ant的配置文件是用XML文档编写的,所以Java程序员应该已经很熟悉其的语法了,这同Make声名狼藉的不友好句法形成了鲜明的对比。更重要的是,构建系统用来构建项目的所有动作,也就是任务,也是用Java编写的;所以同样的构建文件能够被运行在任何可以使用Java编译器的地方。在Ant里,所有的东西都是独立自主的。
在本文里,我们将看到如何安装Ant,如何创建用于构建项目的配置文件,以及如何使用可用的内置系统和条件任务。
安装Ant
要开始的话,我们就需要先去Ant主页,它上面有最新的发行版本、在线使用手册和FAQ。在下载和安装Ant以前,你需要先安装Java开发工具包(1.2或更高版本),需要设置JAVA_HOME环境变量,在你的可执行路径里还需要javac编译器。
你可以从Jakata网站下载预编译的ANT。你还要用到可选的Java Archive(JAR)文件,其包含的任务能有助于与其他开发工具进行集成。Ant也是开放源代码软件,所以如果你想修改任何内部组件来使其适应于自己的开发环境,这没有问题。你要做的只是下载源代码。但是要注意的是,Ant灵活性极强,这一点我们会在下一篇文章里看到,向Ant添加功能是很容易的,而且不需要更改源代码。
一旦下载完了二进制包,你只需要简单地把文件解压到希望安装Ant的地方。对于Windows系统,解压到c:\ant\;在UNIX系统上,你可能希望安装到/usr/local/ant/或者/opt/ant/下。
下一步,你需要设置自己的环境变量,即ANT_HOME。在Windows上,假如我们安装到c:\ant目录下,图A所示的命令会正确地设置你的环境变量。
设置Windows的环境变量
在UNIX系统上,假设我们安装在/usr/local/ant目录下,图B所示的命令会正确地设置你的环境变量。
设置UNIX的环境变量
要在Windows或者UNIX系统上安装可选的任务,你需要把可选的jar文件复制到$ANT_HOME/lib/目录下。Ant或者ant.bat脚本会自动地把jar文件追加到类的路径下。
现在我们测试一下,确信Ant已经正确安装好了。在命令行下,输入ant。你应该会看到一条信息,见图C,说Ant无法定位Build.xml文件。这正是我们所期望的,因为我们还要配置和创建项目文件。
创建文件错误信息
既然Ant已经准备好了读取项目文件,就让我们看看项目文件是什么样的吧。创建项目
创建项目
为了让开发人员的日子更加好过一点,Ant的配置文件是使用XML文档编写的。这样开发人员不用去担心空白的问题(Makefiles就有这个问题),而且许多开发人员都已经能够正确编写XML了。
Ant一启动就会自动地加载一个叫做Build.xml的项目配置文件。如果想给这个项目配置文件取别的名字,你可以使用buildfile标记来运行ant,就像下面这样:
ant -buildfile Project_configuration.xml
在Listing A所示的SimpleBuild.xml配置文件里,你会看到一个项目标签,它带有三个属性:名字、缺省值和basedir。Ant使用说明里有Ant配置文件里每个标签的详细文档。你可能要使用Ant使用说明作为参考书来了解哪些是必需的标签,哪些有缺省值。
在项目标签里,你会看到属性和目标标签。属性标签创建的变量能够被任务和变量扩展访问。正如我们在后面所要看到的一样,有一些变量,像日期和时间,能够在任务内部进行设置,所以不是所有的变量都会被明确地定义。
在属性标签后面,你会看到目标标签。你可以定义多个目标,每一个都有不同的名字。你会注意到目标标签的名字是compile,这碰巧和项目标签里的缺省值相对应。这就意味着我们在执行Ant的时候,它会自动地启动compile目标。
目标里有许多的任务,Ant按顺序来执行它们。你会发现构建、包装和发布过程中几乎每一件事都可以由Ant的任务来处理。
在进行简单的构建时,我们使用tstamp任务来把当前的日期和时间设置到环境变量里。下一步,我们会使用mkdir任务来创建一个叫做${build}的目录。(假设它并不存在。这是我们脚本里命令解释程序扩展的第一个例子。Ant会自动把“${build}”扩展到属性构建所设置的值里,在这种情况下是build字符串。)
最后,我们会使用javac任务来编译来自src目录的源代码,并把输出保存到构建里。
在运行Ant时,我们会让输出来显示每个目标执行的状态,如图D所示。
Ant的输出
一个更加深入的例子
现在我们看看使用多个目标构建一个稍微复杂一点的配置的例子。
在Listing B所示的Medium.xml例子里,配置内容被分成的目标比SimpleBuild.xml例子里的更多。把构建过程分成不同的目标意味着Ant可以从任何点进入构建过程。在SimpleBuild.xml里,我们只用简单地编译Java源代码。但是,在这个例子里,我们启动环境(init),编译代码(compile),把代码包装进jar(package),再把结果复制进产品所在的位置(dist)。我们还有一个在任何代码编译以前通过还原来清除环境的任务。
在缺省状态下,我们会依次运行init,compile,package,然后是dist。你可以看到每个对象都有已定义的相依性;Ant在依赖相依性的目标完成以前就完成好相依性。缺省的目标是dist,所以在命令行运行ant会完成所有的任务。
然而,我们可以通过在命令行指定用所希望的目标来执行所有步骤中的一部分。例如,我们可以只包装代码,而不发布它。把更大的项目分成多个目标能够允许开发人员迅速地进行分段构建,而不必等待完整构建,这会有助于调试和保证高质量的过程。
内置的任务
既然你已经看过了如何创建一个项目文件,那我们就看一些内置的任务。你会希望看一下Ant的文档来获得任务的细节,因为那里所提供的信息比我们这里所涉及的要多。
文件系统任务
你可能会经常使用Ant来完成系统任务:移动、修改、复制和删除文件。在发布和清除临时文件时,你会需要移动文件。这就是为什么懂得文件系统工具的使用是有必要的原因了。
Listing C所示的Fs.xml 例子,给filesystem回应了一条信息。“@…@”标志是Ant如何进行文本替换的标识。要替换文本就要在将被替换的文本前后加上“@”标志。在信息被复制到磁盘以后,我们创建两个目录,复制文件,在我们复制的时候对磁盘上的文件进行标志替换,再删除一个已复制的文件。图E是在Fs.xml构建文件上运行Ant的输出结果。
Filesystem输出实例
使用条件
在Ant里构建条件不太容易。由于Ant构建任务和目标的方法,你不得不小心地构造你的陈述式。只有当属性被设置成真值的时候,条件才能通过执行对象来工作。你可以使用and、or和not陈述式来构造你的条件。在一个条件被发现为真时,你可以使用antcall任务来执行另一个目标。让我们来看一个简单的例子,它会确定可选的声音任务是否可用,以及它是否在UNIX或者Windows上可用。
在Listing D所示的SoundConditional的例子里,你会看到条件任务会调用两个条件陈述式: condWinSound和condUnixSound,但是两者都不会主动执行,除非条件属性被设置。条件目标会检查包装是否可用(这是可选的jar文件一部分),以及在哪个平台上可用。
包装
现在,你应该已经准备好开始把自己的软件项目转移到Ant构建工具上了。Ant正在越来越多地被开发人员用来支持大型的Java项目——而且是因为有了好的理由。这些工具是面向Java的、跨平台的,而且一般都比面向UNIX的工具要更容易使用。希望本文能够让你看到Ant的力量,也能有助于提高你所在组织的产出。在以后的文章里,我们会来看通过创建自己的任务如何来扩展Ant。
文章来源于领测软件测试网 https://www.ltesting.net/
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073