现在的位置: 首页 > 综合 > 正文

1、自动构建工具Ant初步

2018年02月05日 ⁄ 综合 ⁄ 共 8238字 ⁄ 字号 评论关闭

Ant是什么?——Apache Ant是一个基于Java的生成工具。据最初的创始人James Duncan Davidson介绍,这个工具的名称是another neat tool(另一个整洁的工具)的首字母缩写。

从Apache网站下载ant:1.9.2版本,apache-ant-1.9.2-bin.zip,解压缩后,有四个文件夹和几个文件,四个文件夹分别是:bin、lib、etc、manual,假如加压缩的后放在D:\apache-ant-1.9.2\,我们需要在windows的环境变量中path添加bin的路径,添加完毕后,运行ant,在我的环境中出现了以下异常:

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/to
ols/ant/launch/Launcher (Unsupported major.minor version 48.0)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
出现的原因,是自己的机器上曾经安装过oracle,而oracle有自己的jre,是1.3版本的,将path中的C:\Program Files\Oracle\jre\1.3.1\bin;去掉,使用安装的jdk1.6路径,运行正常了,

C:\Documents and Settings\Administrator>ant
Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib\tools.jar
Buildfile: build.xml does not exist!
Build failed

1、Ant的作用

生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式)。随着应用程序的生成过程变得更加复杂,确保在每次生成期间都使用精确相同的生成步骤,同时实现尽可能多的自动化,以便及时产生一致的生产版本,这就变得更加重要。

Ant定义生成文件之间的依赖关系,它它使用跨平台的java类。使用Ant,能够编写单个生成文件,这个生成文件在任何java平台上都是一致的操作(因为Ant本身也是使用java语言来实现的),这就是Ant最大的优势。

Ant默认使用一个叫做build.xml的配置文件。编写一个最基本的build.xml

<?xml version="1.0" encoding="utf-8"?>
<project default="init">
	
	<target name="init">
		<mkdir dir="helloworld" />
	</target>
</project>

一个Ant的build.xml有一个根元素project,然后有很多目标<target>,mkdir是一个方法,创建目录,如果这个build.xml存放在D盘下,我们在d:\下执行ant,就会在D盘下创建helloworld目录,

D:\>ant
Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib\tools.jar
Buildfile: D:\build.xml

init:
    [mkdir] Created dir: D:\helloworld

BUILD SUCCESSFUL
Total time: 1 second

修改mkdir dir=“helloworld\d\c\f”,再次运行,将直接创建d:\helloworld\d\c\f目录,我们在最里层的f中存放一个文件,然后修改target

将mkdir去掉,改为

<delete dir="helloworld">

再次运行ant,将直接删除helloworld及其子目录。

我们也可以自己指定配置文件,使用 -f选项:ant -f helloworld.xml

目标之间有时是有依赖关系的,这一点build.xml可以体现。

2、Ant生成文件剖析

Ant没有定义他自己的自定义语法;相反,它的生成文件是用XM编写的。存在一组Ant能够理解的预定义XML元素,而且还可以定义新的元素来扩展Ant的功能。每个生成文件由单个project元素组成,该元素又包含一个或多个target元素。一个目标(target)是生成过程中已定义的一个步骤,他执行任意数量的操作,比如编译一组源文件。并且这些操作本身是由其他专用任务标签执行的。然后这些任务将根据需要被分组到各个target元素中。一次生成过程所必须的所有操作可以放入单个target元素中,但是那样会降低灵活性。将那些操作划分为逻辑生成步骤,每个步骤包含在他自己的target元素中,这样通常更为可取。这样可以执行整体生成过程的单独部分,却不一定要执行其他部分。

例如,通过仅调用某些目标,你可以编译项目的源代码,却不必创建可以安装的项目文件。

如下,所有操作在一个target中:

<?xml version="1.0" encoding="utf-8"?>
<project default="init">
	
	<target name="init">
		<mkdir dir="helloworld" />
		<mkdir dir="hello" />
		<mkdir dir="world" />
		<mkdir dir="welcome" />
	</target>
</project>

执行结果:

D:\>ant
Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib\tools.jar
Buildfile: D:\build.xml

init:
    [mkdir] Created dir: D:\helloworld
    [mkdir] Created dir: D:\hello
    [mkdir] Created dir: D:\world
    [mkdir] Created dir: D:\welcome

BUILD SUCCESSFUL
Total time: 0 seconds

多个target:

<?xml version="1.0" encoding="utf-8"?>
<project default="second">
	
	<target name="init">
		<mkdir dir="helloworld" />
		<mkdir dir="hello" />
		<mkdir dir="world" />
		<mkdir dir="welcome" />
	</target>
	<target name="second">
		<mkdir dir="abcd" />
		<mkdir dir="cde" />
		<mkdir dir="xyz" />
	</target>
</project>

注意:这里project的default改为second,与第二个target的名字相同,指出默认执行哪一个target,执行结果:

D:\>ant
Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib\tools.jar
Buildfile: D:\build.xml

second:
    [mkdir] Created dir: D:\abcd
    [mkdir] Created dir: D:\cde
    [mkdir] Created dir: D:\xyz

BUILD SUCCESSFUL
Total time: 0 seconds

只执行了target的name为second的目标。

<?xml version="1.0" encoding="utf-8"?>
<project default="second">
	
	<target name="init">
		<delete dir="helloworld" />
		<delete dir="hello" />
		<delete dir="world" />
		<delete dir="welcome" />
	</target>
	<target name="second" depends="init">
		<mkdir dir="abcd" />
		<mkdir dir="cde" />
		<mkdir dir="xyz" />
	</target>
</project>

修改second,增加depends=“init”,这一句的意思是这个target依赖名字为init的target,即要运行target为second,需要先运行名字name为init的target,执行结果:

D:\>ant
Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib\tools.jar
Buildfile: D:\build.xml

init:
   [delete] Deleting directory D:\helloworld
   [delete] Deleting directory D:\hello
   [delete] Deleting directory D:\world
   [delete] Deleting directory D:\welcome

second:

BUILD SUCCESSFUL
Total time: 0 seconds

second没有执行结果,因为目录都存在不必执行了。
顶级project元素需要包含一个default属性,如果在Ant被调用时没有指定目标,这个属性将指定要执行的目标。然后需要使用target元素来定义该目标本身。

对于上面的build.xml,我们可以单独执行init:ant init

D:\>ant init
Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib\tools.jar
Buildfile: D:\build.xml

init:

BUILD SUCCESSFUL
Total time: 0 seconds

因为目录都不存在,所以没有任何操作,还可以一次指定多个目标,如:ant init second

D:\>ant init second
Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib\tools.jar
Buildfile: D:\build.xml

init:

init:

second:

BUILD SUCCESSFUL
Total time: 0 seconds

先执行init,再执行second,因为second依赖init,init再次执行

 ant生成文件的基础结构:

<?xml version="1.0"?>
<project default="init">
<target name="init"></target>
</project>

更进一步的:

<?xml version="1.0" ?>
<project default="init" name="Project">
<description>
A simple project 
</description>
<!-- XML comments can also be used -->
<target name="init" description="Initialize Argon database">
<!-- perform initializayion steps here -->
</target>
</project>

description标签相当于一个注释、说明,project、target标签都有一个description属性,用于对标签进行说明和描述,当然也可以使用xml的注释<!-- -->进行注释。

可以看出,xml注释可以使用在整个生成文件中以提高清晰性。而且,Ant定义了它自己的description元素和description属性,它们可用于提供更结构化的注释。

Ant中的属性类似编程语言中的变量,它们都具有名称和值。然而与通常的变量不同,一经设置,Ant中的属性就不可更改;它们是不可变的,就像java语言中的String对象。这起初看来似乎很有限制性,但这样是为了遵循Ant的简单原则:毕竟,他是一个生成工具,而不是一种编程语言。如果尝试给某个现有属性赋予一个新的值,这不会被看做是一个错误,但是该属性仍然会保留其现有值。

定义与使用属性

<property name="metal" value="beryllium" />

为了在生成文件的其他部分引用这个属性,使用以下语法:${metal}

例如,为了使用这样一个值,它是另一个属性的值的组成部分,将标签写成下面这样:

<property name="metal-database" value="${metal}.db"/>

生成文件的target是无序的,执行的先后主要看depends依赖关系。

location属性:

属性经常用于引用文件系统上的文件或目录,但是对于使用不同路径分隔符(例如,\与/)的平台来说,这样可能在跨越不同平台时导致问题。Ant的location属性专门设计用于以平台无关的方式包含文件系统路径。像下面这样使用location来代替value:

<property name="database-file" location="archive/database/${metal}.db" />

用于location属性的路径分隔符字符将被转换为当前平台的正确格式;而且由于文件名是相对的,它被认为是相对于项目的基目录。我们同样可以容易的写为下面这样:

<property name="database-file" location="archive\database\${metal}.db" />

这个标签的两个版本都会在不同的平台具有相同的行为。

定义依赖关系:

生成一个项目一般需要许多步骤——例如首先要编译源代码,然后将它打包为java归档文件(java Archive File,JAR)。这其中许多步骤都具有清楚定义的顺序——例如,在编译器从源代码生成类文件之前,你不能打包类文件。与顺序指定target所不同的是,Ant采用一种更灵活的方法来定义依赖关系。每个目标的定义依据的是在它能够执行之前必须完成的其他所有目标。这是使用target元素的depends属性来实现

依赖关系:

<target name="init"/>
<target name="preprocess" depends="init" />
<target name="compile" depends="init,preprocess"/>
<target name="package" depends="compile"/>

这里如果执行target为package的目标,init只会执行一次,这与显示在ant命令中指明init package不同。

这种方法允许你执行项目任何阶段的生成过程;Ant会首先执行已定义的先决阶段。在上面的例子中,如果让Ant完成compile步骤,他将判断出需要首先执行init和preprocess这两个目标。init目标不依赖其他任何目标,因此他将首先被执行。然后Ant检查preprocess target,发现它依赖init目标;由于已经执行了后者,Ant不会再次执行它,因而开始执行preprocess目标。最后可以执行compile任务本身。

注意目标出现在生成文件中的顺序并不重要:执行顺序是由depends属性唯一确定的。

将上面的目标写到build.xml中,执行package目标,结果:

D:\>ant
Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib\tools.jar
Buildfile: D:\build.xml

init:

preprocess:

compile:

package:

BUILD SUCCESSFUL
Total time: 0 seconds

3、在MyEclipse中创建build.xml,要注意生成文件的存放位置,是在项目的根目录下,例如创建了一个test项目,那么build.xml就放在test项目目录下,如果我们的项目目录是d:\workspace\test\,则build.xml就在d:\workspace\test\下,而不是在src或其他目录下。

创建build.xml后,其图标应该变为一个蚂蚁的样子,如果没有改变,修改myeclipse的preferences的General——Editors——File Associations,增加build.xml,关联的editors选择Ant Editor,并设为默认。

<?xml version="1.0" encoding="UTF-8"?>
<project name="MyProject" basedir="." default="package">
	
	<property name="hello" value="hello123"></property>
	<property name="world" value="world123"></property>
	
	<target name="init"></target>
	
	<target name="preprocess" depends="init">
	
		<mkdir dir="${hello}"/>
		<mkdir dir="${world}"/>
	</target>
	
	<target name="compile" depends="init,preprocess"></target>
	
	<target name="package" depends="compile"></target>
</project>

注意红色部分,一般都是这样写,表示基目录就是当前项目目录。执行结果:

Buildfile: G:\workspace\test\build.xml
init:
preprocess:
    [mkdir] Created dir: G:\workspace\test\hello123
    [mkdir] Created dir: G:\workspace\test\world123
compile:
package:
BUILD SUCCESSFUL
Total time: 94 milliseconds

注意目录,基目录“.”现在代表的就是G:\workspace\test,也是项目的目录。

myeclipse提供了一个ant视图,方便调试运行不同的目标。

抱歉!评论已关闭.