因为学习hadoop需要编译hadoop2.5.2的eclipse插件,故需要学习下apache ant。本文首先对apache ant做一个简要的介绍,其次,介绍ant的安装及使用,至于对hadoop2.5.2版eclipse插件的编译,将在下一篇记录中向大家介绍。
强烈推荐apache ant官方文档:http://ant.apache.org/manual/index.html
这是每一个想入门或者进一步掌握apache ant最好的文档。
Apache Ant 简介
Apache Ant是目前事实上的Java应用的标准build脚本工具。使它大受欢迎的一个主要愿意是它的和灵活,允许程序员创建自己的Task来对Ant进行扩展。
Ant的安装
Apache Ant是Apache基金会下的一个项目,可以在http://ant.apache.org下载到。根据不同的平台下载不同的压缩包,直接解压到安装目录就可以了,不需要安装。解压后,在PATH环境变量中添加Ant的安装目录。
Ant简介
我想大家都听说过很多build工具,如make,maven等。那么为什么我们选择Ant呢?简单说,Ant有以下这两个优点。
使用java开发,并用xml存储build信息,因此是跨平台的。
程序员可以自己扩展Ant。程序员可以自己写java程序来扩展Ant,创建自己的tasks。
make这一类的工具是基于操作系统shell的,因此移植性不好。并且Ant也可以通过
Ant使用XML来存储build信息,在xml文件里有很多task的定义,默认使用的文件是build.xml。
FirstBuild.xml
通过实例来说明Ant的build.xml文件的结构会更清晰一些,这里使用的build文件是FirstBuild.xml,它实现了创建一个文件夹并拷贝一个文件进入这个文件夹。
首先,要有
下一步,定义这个工程所使用的properties:
这里定义了两个全局属性,分别是dir.name和file.name。这些属性是可选的,但使用属性会更方便,尤其是便于维护。一种更有效的方式是将这些属性放到一个专门文件里,从而使这个xml文件更加灵活,易于重用。
因为这个build文件很简单,所以没有task和path的定义。
最后,定义所要执行的targets。
注意copyfile中的depends,denpends属性意味着在执行copyfile之前,makedirectorytarget一定要先执行。
Ant的语法结构一般是:
ant -buildfile
如果没有使用-fuildfile参数,那么Ant将默认使用build.xml,如果没有build.xml,那么Ant将报错,如下:(这也可以用来验证ant是否成功安装)
$ ant
Buildfile: build.xml does not exist!
Build failed
因为我们的build文件名不是build.xml,因此需要添加-buildfile这个参数。下面是使用-buildfile参数的结果:
$ ant -buildfile FirstBuild.xml
Buildfile: FirstBuild.xml
makedirectory:
[mkdir] Created dir: /home/tomcat/AppendixB/mydir
copyfile:
[copy] Copying 1 file to /home/tomcat/AppendixB/mydir
BUILD SUCCESSFUL
Total time: 1 second
在文件中定义的property可以被Ant的参数所覆盖,如下面使用yourdir取代mydir:
$ ant -buildfile FirstBuild.xml -Ddir.name=yourdir
Buildfile: FirstBuild.xml
makedirectory:
[mkdir] Created dir: /home/tomcat/AppendixB/yourdir
copyfile:
[copy] Copying 1 file to /home/tomcat/AppendixB/yourdir
BUILD SUCCESSFUL
Total time: 1 second
一般在build.xml中都会有clean这个target,其作用有些像卸载软件程序:
$ ant -buildfile FirstBuild.xml clean
Buildfile: FirstBuild.xml
clean:
[delete] Deleting directory /home/tomcat/AppendixB/mydir
BUILD SUCCESSFUL
Total time: 0 seconds
使用Ant创建web应用程序
前面的那个Ant任务比较简单,下面介绍一个有些复杂又十分常用的Ant文件:我们要用Ant来构建一个web应用程序。
src放置java文件,web放jsp等页面文件和配置文件,dist用来存放生成的war文件,build用来放编译好的servlet,lib用来放库文,doc用来放生成的javadoc,以及最主要的,build.xml。其中,build,dist和doc是使用Ant脚本来生成的。
build.xml
build.xml的第一部分:
下一部分还是全局可用的properties。
clean target,用于删除build和dist目录及其所有子目录。
description=”Cleanup- deletes everything generated by the ant script”>
init target用于完成初始化工作,包括创建目录结构,初始化Java CLASSPATH。CLASSPATH中包含这个web应用程序使用的所有库文件。下面的代码将servlet-api.jar包进来。
compile target将编译src目录中所有的java文件,生成的class文件将被存放到destdir属性所指的目录中,compile必需是在init完成之后才能执行。如果使用compile命令,则将自动先执行init。
destdir=”${build.home}”
debug=”true”
classpath=”${classpath}”
deprecation=”true”>
dist target将创建一个war文件。
description=”Creates the deployable WAR file”>
webxml=”${web.home}/WEB-INF/web.xml”>
javadoc target将为源码创建javadoc文档。
project”>
packagenames=”com.foobar.*”
classpath=”${classpath}”
destdir=”${docs.home}”
windowtitle=”Javadoc for the Sample Web Application (TM)”>
all target将上面这些任务按在depends中的顺序组织起来。
depends=”clean, prepare, compile, dist”
description=”Builds the web application and war file”/>
使用Ant管理web应用程序
继续上面的那个build.xml文件,在其中添加下面的这些代码,就可以通过Ant管理这个web应用程序了。
...
password=”${tomcat.password}” path=”${context.path}”
war=”${war.file}” update=”true” />
password=”${tomcat.password}” path=”${context.path}”/>
password=”${tomcat.password}” path=”${context.path}”/>
password=”${tomcat.password}” path=”${context.path}”/>
password=”${tomcat.password}” path=”${context.path}”/>
password=”${tomcat.password}”/>
下载apache-ant-1.9.6
http://ant.apache.org/bindownload.cgi
一、解压ant安装包在E:\HadoopProgram下
二、环境变量配置
ANT_HOME
E:\HadoopProgram\apache-ant-1.9.6
CLASSPATH
;%ANT_HOME%\lib;
PATH ;%ANT_HOME%bin;
三、测试是否安装成功
在cmd命令方式下输入:ant -version
出现问题:
1)Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib
命令行敲ant命令后提示:“Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre6\lib”;ANT_HOME环境变量已经配置;
解决途径:将“C:\Program Files\Java\jdk1.6.0_16\lib”目录下的tools.jar文件拷贝到“C:\Program Files\Java\jre6\lib”目录下,重新运行命令ant,运行正常,问题解决。
2)在cmd命令中:输入ant,如果输出: Buildfile:build.xml does not exist!
Build failed
说明ant安装成功。
四、运行第一个ant脚本
编写build.xml文件保存到任意位置。如:E:\workspace
内容如下:
运行:
Buildfile: ant -f E:\workspace\build.xml
运行结果:
Buildfile: E:\workspace\build.xml
mkdir:
BUILD SUCCESSFUL
Total time: 0 seconds
检查在目录E下生成testMKDir文件夹
通过IDE来使用ant。
目前的Eclipse都集成了ant,本文图示如何在eclipse下使用ant。
1.新建Java Project-新建Java文件HelloWorld.java
HelloWorld.java
package example; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } |
2.在工程根目录下新建build.xml
build.xml
|
此脚本文件内容是编译/src/example下的java文件,并就地生成class文件,将这个class文件打成jar包,HelloWorld.jar。
此时工程的目录结构如下图所示:
右键选中HelloAnt工程,选择Properties:
选择Builders-New…,选择Ant Build,
Name:Ant_Builder;
Buildfile:${workspace_loc:/HelloAnt/build.xml};
Base Directory:${workspace_loc:/HelloAnt};
(按“Browse Workspace”选择工程根目录)
在Builder面板中钩上Ant_Build,去掉Java Builder,即可编译执行。
每次编译时,右键build.xml,选择Run As-Ant Build:
此示例工程编译结果:
Buildfile: D:\dev\Workspaces\J2EE\HelloAnt\build.xml
compile:
compress:
main:
[echo] Building the .jar file.
BUILD SUCCESSFUL
Total time: 281 milliseconds
问题:ant编译中出现“includeantruntime was not set”警告的问题
执行ant编译时,总会出现如下的警告:
[javac] D:\SnowPad\build.xml:26: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
虽然不影响编译,但还是解决才安心。其实解决方法也很简单,只需要根据提示在javac任务中添加includeAntRuntime="false"属性即可。例如:
修改前:
修改后:
注:
1.对于includeAntRuntime属性,官方的解释如下:
Whether to include the Ant run-time libraries in the classpath; defaults to yes, unless build.sysclasspath is set. It is usually best to set this to false so the script's behavior is not sensitive to the environment in which it is run.
2.此警告在较早的ant版本中可能不会出现,当前用的版本是:Apache Ant(TM) version 1.8.2 compiled on December 20 2010。所以此问题跟ant版本有关。
参考文章:
http://blog.csdn.net/jubincn/article/details/4897610
http://blog.sina.com.cn/s/blog_62ef85c201016e2n.html
http://zhangjunhd.blog.51cto.com/113473/128317/