apache 编译java_Apache Ant对决Make:实战Java构建工具

Apache Ant是一个基于Java的构建工具,类似Unix/Linux的Make工具,但具有跨平台的优势。Ant最初为Tomcat项目的一部分,后来因其简洁适用性在Java开源项目中广泛传播。本文介绍了Ant的起源、历史、安装过程,并通过对比命令行构建,展示了Ant的使用方法和优势。
摘要由CSDN通过智能技术生成

【IT168 专稿】一谈到英语单词Ant,人们很自然的想到蚂蚁。而一谈到另一个单词Make,人们也会很自然想到构建工具。有谁会将这两个词关联起来呢?那么Ant究竟有什么神奇之处呢?本文会为您揭晓答案。

什么是Ant

Apache Ant是一个基于Java的构建(Build)工具。理论上讲,类似Unix/Linux C程序员经常使用的Make工具。与Make相比,Ant完全由Java实现,具有跨平台的好处。

Ant的命名来源

至于Ant的称呼,颇有点意思。据Ant原作者James Duncan Davidson本人介绍,Ant是“Another Neat Tool”的缩写,意思是“另一个简洁的工具”,意思是比Make更简洁,适用。不过,人们更愿意接受Ant即“蚂蚁”这样的理解。众所周知,蚂蚁是动物世界赫赫有名的建筑师(ants do an extremely good job at building things);蚂蚁体格虽小,但力气超强(ants are very small and can carry a weight dozens of times their own)。

fafef021741425dbd9c080c3ccfb6f5b.png

Ant的历史

说起Ant,就不得不说另一个Apache开源项目Tomcat。Tomcat作为轻量级Web容器,早已声名鹊起。最初,Ant其实是Tomcat的一部分,Ant的唯一目的就是build Tomcat。Ant原作者James Duncan Davidson也是Tomcat的创始人。

不久,很多Java开源项目意识到Ant的简洁适用,更重要的是弥补Makefiles的不足。自从Jakarta以及Apache项目开始采用Ant以来, 作为构建工具,Ant就像病毒一样,传播到各种各样的项目。

2000年1月,Ant脱离了Tomcat,成为独立的Apache开源项目,由独立的CVS模块维护,正式更名为Apache Ant。2000年7月,Apache Ant的第一个版本1.1正式亮相。截至笔者发稿时,Apache Ant的最新版本为1.8.2,发布日期为2010年12月27日。点击http://ant.apache.org/bindownload.cgi下载最新版本。

Ant的安装

在简单介绍Ant的相关背景之后,我们以Windows平台为例,介绍如何安装Ant。

为顺利安装Ant,请确保Java版本在1.4以上,推荐1.5。为确保Ant功能全部可用,请使用JDK,不推荐使用JRE。第一种方式是选择Windows installer for Apache Ant自动安装,默认Ant安装目录为C:\Program Files\WinAnt 。并自动创建环境变量ANT_HOME与PATH,指向Ant根目录。这种方式的特点是简单、迅速。

第二种方式是手工安装。具体方法如下:

1. 下载。如前述所,从ANT Binary Page(http://ant.apache.org/bindownload.cgi)下载Ant二进制安装包a.zip。解压后目录如下:

bin – 公共的二进制文件,以及运行脚本

build – 临时创建的文件,如.class文件

dist – 目标输出文件,如.jar文件

docs – 文档

lib – 需要导出的jar包

src – 源文件

2. 指定ANT_HOME变量。打开控制面板 -> 系统 –> 高级 –> 环境变量。创建用户变量ANT_HOME,值为zip包解压路径。例如:

变量名:”ANT_HOME”

变量值:"C:\Program Files\Apache Software Foundation\apache-ant-1.8.1"

9cc666efa6ca50f7918f4e252ad28267.png

3. 将ANT_HOME加入PATH变量。

变量名:" PATH"

变量值:" ;%ANT_HOME%\bin"

586ea09c9b7df9a1230448adb37777ac.png

4. 创建用户变量JAVA_HOME,值为Java安装目录。例如:

变量名:”JAVA_HOME”

变量值:"C:\Program Files\Java\jdk1.6.0_21"

9d91fafd4096465feb75a4e7547ee60f.png

创建用户变量JAVA_HOME,值为Java安装目录。JAVA_HOME = C:\Program Files\java\jdk1.6.0_02

5. 将JAVA_HOME加入PATH变量。

变量名:" PATH"

变量值:" ;%JAVA_HOME%\bin"

9f47b79166add699886d78769980902d.png

相比于前一种,第二种方式更加灵活。

无论哪种方式,可以使用下列办法确保安装成功,

• 使用javac –version检查Java环境是否正确。返回值应为:javac 1.6.0_21

• 使用ant –version检查Ant环境是否正确。返回值应为:Apache Ant version 1.8.1 compiled on April 30 2010。

如图所示:

c51dab3134ea51261b5539ac9499c665.png

第一个Ant示例

假设我们创建一个Java工程HelloWorld,将源文件.java存放在src目录,编译后的字节码.class存放在bin目录,对应的jar包存放在exe目录,结构如下图:

4e9d304eda2dcf9cd66d9f137d26156d.png

HelloWorld.java清单如下:

publicclass HelloWorld {publicstatic void main(String[] args) {

System.out.println("Hello World");

}

}

我们分别采用命令行与Ant两种不同的build方式。

1. 命令行

首先,创建src目录:

md src

其次,创建bin目录,编译并运行:

md bin

javac-sourcepath src-d bin\src\HelloWorld.java

java-cp bin HelloWorld

再次,创建exe目录,创建jar包,包含创建manifest文件,exe目录,jar打包。一个命令就可以搞定:

echo Main-Class: HelloWorld>MonManifest md exe jar cfm exe\HelloWorld.jar MonManifest-C bin .

最后,运行工程:

java-jar exe\HelloWorld.jar

2. Ant

Ant的构建脚本文件build file是使用XML语言编写,下文我们简称为build.xml。build.xml包含一个标准的根节点Project,表示一个工程。每个build文件只允许定义一个Project元素。Project定义至少1个或多个Target,表示不同的模块。而Target又是一些列Task的集合,而每一个Task是一段可执行的代码。三者的关系如图表示。更多细节,请参见Apache Ant官方网站:http://ant.apache.org。

1f7266d8cb872018.JPG

我们使用Ant来build工程HelloWorld。build.xml包含4个target:clean,compile,jar,run。

clean

clean清除所有的编译文件以及相关目录,这里为目录bin以及exe。

compile

compile创建目录bin,编译src目录源文件,生成的.class文件放在bin目录。

jar

jar创建目录exe,打包jar。使用manifest元素可轻松创建manifest文件。

run

run 运行jar。

需要指出的是,以上4个target的执行顺序上有依赖关系的。例如jar依赖于compile,run依赖于jar。Ant提供了属性depends来描述target之间的依赖关系。举个例子,假设执行D,由于D依赖于C,C依赖于B,B依赖于A,因此,从顺序上,先执行A,其次B,然后C,最后D。每个Target最多只能被执行一遍。

对于我们的工程HelloWorld。可以运行下列Ant命令。

ant clean

ant compile

ant jar

ant run

当然,可以简单地运行

ant run

build.xml清单如下:

Eclipse提供Ant视图,可以很方便查看与编辑Ant脚本,如图:

514eb23124ea25ee.JPG

Ant API

Ant的强大之处在于,不仅可以调用Ant脚本进行各种文件部署、管理工作,也可以调用Ant丰富的API,甚至扩展Ant API编程。举几个例子:

1. 创建目录:

Project prj=newProject();

Mkdir mkdir=newMkdir();

mkdir.setProject(prj);

mkdir.setDir(newFile("src"));

mkdir.execute();

2. 将class文件打成jar包

Project prj=newProject();

Jar jar=newJar();

jar.setProject(prj);

jar.setDestFile(newFile("HelloWorld.jar"));

FileSet fileSet=newFileSet();

fileSet.setProject(prj);

fileSet.setDir(newFile("bin"));

fileSet.setIncludes("**/*.class");

jar.addFileset(fileSet);

jar.execute();

创建自己的Task

Apache Ant允许用户自定义Task,步骤如下:

1. 创建一个类,继承org.apache.tools.ant.Task

2. 对于每一个Attribute,需要实现标准的Java bean规范的set方法。

3. 如果创建的Task需要其它其它的子Task,则需要实现org.apache.tools.ant.TaskContainer接口。

4. 如果扩展的Task需要支持Text,需要实现方法public void addText(String)。

5. 对于每个嵌套的元素,实现create, add或者addConfigured方法。

6. 实现public void execute()方法。

7. 在build.xml中使用引用自定义Task。

举个例子,我们写一个自定义的Task,目的是在Java控制台打印一条消息。该Task只有一个属性,称为message。

源代码MyTask.java

import org.apache.tools.ant.BuildException;

import org.apache.tools.ant.Task;publicclass MyTask extends Task {privateStringmsg;//The method executing the taskpublicvoidexecute() throws BuildException {

System.out.println(msg);

}//The setterforthe"message"attributepublicvoid setMessage(Stringmsg) {

this.msg=msg;

}

}

对应的build.xml

算上MyTask的编译,完整的Ant脚本为:

Ant重要标签列表

标签

每个构建文件对应一个项目。 标签时构建文件的根标签。它可以有多个内在属性,如下:

(1) default表示默认的运行目标,这个属性是必须的。

(2) basedir表示项目的基准目录。

(3) name表示项目名。

(4) description表示项目的描述。

标签

一个项目标签下可以有一个或多个target标签。一个target标签可以依赖其他的target标签。一个target只能被执行一次, 即使有多个target依赖于它。如果没有if或unless属性,target总会被执行。target标签其属性如下。:

(1).name表示标明,这个属性是必须的。

(2).depends表示依赖的目标。

(3)if表示仅当属性设置时才执行。

(4)unless表示当属性没有设置时才执行。

(5)description表示项目的描述。

标签

该标签用于创建一个目录,它有一个属性dir用来指定所创建的目录名,其代码如下:

标签

该标签用来生成一个JAR文件,其属性如下。

(1) destfile表示JAR文件名。

(2) basedir表示被归档的文件名。

(3) includes表示别归档的文件模式。

(4) exchudes表示被排除的文件模式。

标签

该标签用于编译一个或一组java文件,其属性如下。

(1).srcdir表示源程序的目录。

(2).destdir表示class文件的输出目录。

(3).include表示被编译的文件的模式。

(4).excludes表示被排除的文件的模式。

(5).classpath表示所使用的类路径。

(6).debug表示包含的调试信息。

(7).optimize表示是否使用优化。

(8).verbose 表示提供详细的输出信息。

(9).fileonerror表示当碰到错误就自动停止。

标签

该标签用来执行编译生成的.class文件,其属性如下。

(1).classname 表示将执行的类名。

(2).jar表示包含该类的JAR文件名。

(3).classpath所表示用到的类路径。

(4).fork表示在一个新的虚拟机中运行该类。

(5).failonerror表示当出现错误时自动停止。

(6).output 表示输出文件。

(7).append表示追加或者覆盖默认文件。

标签

该标签用于删除一个文件或一组文件,其属性如下。

(1).file表示要删除的文件。

(2).dir表示要删除的目录。

(3).includeEmptyDirs 表示指定是否要删除空目录,默认值是删除。

(4).failonerror 表示指定当碰到错误是否停止,默认值是自动停止。

(5).verbose表示指定是否列出所删除的文件,默认值为不列出。

标签

该标签用于文件或文件集的拷贝,其属性如下。

(1).file 表示源文件。

(2).tofile 表示目标文件。

(3).todir 表示目标目录。

(4).overwrite 表示指定是否覆盖目标文件,默认值是不覆盖。

(5).includeEmptyDirs 表示制定是否拷贝空目录,默认值为拷贝。

(6).failonerror 表示指定如目标没有发现是否自动停止,默认值是停止。

(7).verbose 表示制定是否显示详细信息,默认值不显示。

Ant调试

Eclipse 3.1及以上版本开始支持Ant调试。以下是Eclipse用于调试的具体步骤。

首先,在Ant脚本的target中设置断点,这个与Java文中设置断点几乎没有区别,如下图所示。但是Ant脚本不支持Hit Count与条件断点。

ec32f613fc6daebc.JPG

接下来,通过Debug As –> Ant Build启动Ant调试。与Java调试一样,调试光标停在断点处,如下图所示。Ant支持单步断点执行命令Step Over与 Run to Line。

46526622db48b52d.JPG

除此之外,我们可以使用Debug视图查看变量值,如图所示。

c86550fd93eb56f1.JPG

如果是远程调试,需要在Ant脚本中添加相应的参数,如下:

...

总结

总之,Ant具有两个突出的优点。一方面,作为一个Java应用,Ant具有跨平台的特点。另一方面,Ant脚本是标准的XML,可读性好。Eclipse对Ant脚本也提供强大的内置支持。从这个角度来说,Apache Ant无论是作为Another Neat Tool,或者蚂蚁,笔者都欣然接受。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值