http://blog.csdn.net/onlyqi/article/details/7211708
http://blog.csdn.net/onlyqi/article/details/7211708
说到Ant,是有一点过时了,现在maven已经被广泛使用。
但是作为一个老牌的build工具,Ant在现存项目中仍然被广泛使用着。所以学习它也是在所难免的。
官方使用手册:
http://ant.apache.org/manual/
一个不错的学习ant的网站。我的这篇文章不是ant入门,所以强烈建议没入门的同学从这个网站开始:
http://www.exubero.com/ant/antintro-s5.html
1,Ant是Apache的开源项目
2,Ant的表现形式是XML格式的Ant script,里面由一系列顺序执行的“command”组成。所有Ant有一套自己的语法,但是非常简单直接。
3,Ant是用java编写的。它本质上就是一个java程序,将XML格式的Ant script解释成实际的java程序后,运行。
有时Ant运行出错时,可以看到低层程序抛出的java异常。
Ant script是XML的格式。它的组成要素是:
project
target -- a tartget is a set of tasks you want to execute. you also can select which targets you want to execute when starting Ant
task
property--property是immutable的。可以把property理解成string constant,字符常量,而不是变量。一旦定义好这个字符变量后,就可以在后面的task中使用了。
Ant已经定义好了一系列的build-in properties可以直接使用。
1,例如${os.name}, 其实就是java中提供的getProperties方法提供的变量。
2,此外Ant还额外提供了一些properties。
<property file="..\project.properties" /> 我们会经常需要从一个配置文件load一系列的properties进来。
<property environment="env"/>
也会经常需要使用环境变量。
当我们在使用cruisecontrol或jenkins调用ant时,也许在ant脚本里需要使用一些环境变量,例如JENKINS_HOME。
Jenkins会将一些类似JENKINS_HOME设置为环境变量,然后ant中就可以用上句接收这些环境变量了。
path--这个在后面解释
Ant脚本是XML的形式,可以方便的 用文本编辑器编辑。因此Ant没有专门的编辑工具或IDE。
Notepad++就是一个不错的编辑工具,结合它自身的全文搜索功能,高亮关键字功能等,可以在理解逻辑关系,编写脚本时省去不少麻烦。
但是在编辑复杂Ant脚本时仍然会遇到很多问题:
1,有时逻辑上的跳转太厉害,看一会儿就晕了。
2,无法debug。
ant执行出错时,会返回出错的代码行数,而且很准确。同时有时也会抛出低层的java异常。
因此根据ant log判断问题所在并不是很困难。
但是不能debug,仍然会经常导致难以判断问题所在。例如虽然看起来是某行代码出错,但实际上是另外代码引起的。此类问题完全只能靠经验和阅读ant log判断。
3,在阅读ant脚本时,当遇到非core task时,常常不知道是哪个插件的功能。
例如在ant中看到shellscript task,这不是一个ant提供的标准功能,也无法直接得知这是哪个第三方工具提供的功能。
但是绝大多数IDE都集成了ant。例如在eclipse中运行,debug ant script非常方便:
1,在eclipse中open file->选择打开一个build.xml。
2,此时eclipse的outline会显示出ant script的结构。
3,右击其中任何一个结构体,例如target,就可以看到run as ant build或debug as ant build了。点击即可运行。
要运行Ant非常简单,直接在命令行里运行即可。
ant [options] [target-names]
例如:ant run targetname
在插件方面,ant无法和maven相比。但ant仍然有一些第三方工具被大量使用。
查看有哪些插件:
http://ant.apache.org/external.html#IDE%20and%20Editor%20Integration
大家知道ant有很多core-task,而插件则提供了更多了tasks,可在Ant script中使用。
1,首先需要把第三方类库的jar文件都copy到一个目录下。如/lib
2,其次在Ant script中加入以下语句。此时path的作用就很清楚了,其实就是告诉ant应该去哪里找jar文件。和classpath的作用一样。
<property name="lib.dir" value="lib"/>
<path id="project.classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
3,最后定义要使用的第三方类库,注意classpathref的值就是我们刚刚定义的path id。
<taskdef resource="net/sf/antcontrib/antlib.xml" classpathref="project.classpath"/>
<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" classpathref="project.classpath"/>
<taskdef uri="jwaresoftware.antxtras" resource="org/jwaresoftware/antxtras/install/antlib.xml" classpathref="project.classpath" />
4,然后在ant script中就可以方便的使用除了ant的core-task以外的其他tasks了。
需要注意的是:如果在ant中运行一个程序,例如自己写的helloworld,其中使用了log4j类库,则需要将log4j的jar加入到/lib下才能运行。
因为path的作用就是运行java程序时的classpath。不要试图去修改CLASSPATH环境变量,这是关于使用ant的最著名的一个误区。
所以ant插件的本质就是:ant定义了一系列的接口,插件是符合这些接口的java程序。当使用taskdef调用这些第三方java程序时,ant会自动load这些jar文件,之后用户就可以在ant script中使用这些插件提供的方法了。
我见到的工具之一ant contrib:
http://ant-contrib.sourceforge.net/tasks/tasks/index.html
其中的trycatch和shellscript很有用。