Ant 是一种基于Java的构建工具。从理论上来说,它有些类似于(UNIX)C中的make,但是没有make的缺陷。
Ant使用Java的类来扩展。Ant的配置文件是基于XML的,用户不必再编写shell命令,通过调用目标(target)树,就可以执行各种任务(task)。每个任务由一个实现了特定Task接口的对象来运行。
总的来说,Ant是一种跨平台的构建工具,此外,Ant的配置文件时XML格式的,比make脚本更容易编写和维护,也更通用。
编写Ant的构建文件
Ant的构建文件采用XML格式,每个构建文件都包含一个<project>元素和至少一个<target>元素。<target>元素包含任务(task)元素。构建文件的每一个任务元素都可以由一个id属性,其值必须是唯一的,通过这个id可以引用任务。
Ant的构建文件通常都命名为build.xml,Ant根据构建文件中指定的任务,完成整个项目的编译、打包、发布等工作。
“*.*”和“**”的区别,前者表示目录下的所有文件,后者表示目录下的所有文件、子目录,以及子目录下的所有文件。
<project name="bookstore" default="build" basedir=".">
工程名是bookstore,工程默认的目标是:build,基目录时build.xml文件所在的路径
通过使用<target>元素的if或者unless属性,可以让目标在满足某个条件时执行。
例如:<target name="build" depends="compile" if="build" description="在build目录下建立war">
那么执行Ant时,build目标将不会被执行,如果要执行build目标,需要设置build特性(property),它的值是什么并不重要。输入下面的命令,build目标将被执行:
ant -Dbuild=abc;
if和unless属性只能让使用了这两个属性的目标执行或者不执行,而不能控制该目标所依赖的目标是否执行。
任务的介绍
一个任务是一段可执行的代码,一个任务可以有多个属性
如:<name attribute1="value1" attribute2="value2" .../>
1、property任务
一个工程可以由一组特性,这些特性可以在构建文件中通过<property>任务来设定,或者的Ant外部设定。一个特性有一个名字和一个值,名字是区分大小写的。特性可以在任务的属性值中使用,形式为“${特姓名}”
如:<property name="build.dir" value="${basedir}/build"/>
<mkdir dir="${build.dir}"/>在调用mkdir任务时,创建build目录,${build.dir}被解析为build(而${basedir}被解析为 . ).
特性文件也可以单独放到一个文件里如:build.properties,并和build.xml在同一个目录下,那么在build.xml里只要加一句<property file="build.properties".>即可
如果是用resource属性指定的话,就要在classpath路径上找resource指定的那个文件名
2、mkdir任务
用于创建一个目录,它只有一个属性-dir,这是要创建的目录
3、copy任务
用于拷贝一个文件或一组文件,主要是将Web应用程序中的文件和Java源文件代码拷贝到build目录下,在里面可以嵌套一个fileset元素,fileset又可以嵌套include和exclude元素,用于指定要包含或排除的文件样式。
例如:
<copy todir="${build.dir}">
<fileset dir="${basedir}">
<include name="*.jsp"/>
<include name="image/*.*"/>
<include name="WEB-INF/*.*"/>
<exclude name="build.xml"/>
</fileset>
</copy>
4、delete
用于删除一个文件或一个目录,或者删除使用嵌套的<fileset>元素指定的一组文件。
如:<delete dir="${build.dir}"/>
5、javac
用于编译Java源文件。在编译源文件时,源目录和目标目录将被递归的扫描。只有在Java源文件没有对应的class文件,或者class文件比Java源文件旧时,才会发生编译。
例如:
<javac srcdir="${src}"
destdir="${build}"
includes="mypackage/p1/**,mypackage/p2/**"
excludes="mypackage/p1/testpackage/**"
classpath="xyz.jar"/>
编译${src}目录下的.java文件,不过只有在mypackage/p1和mypackage/p2下的文件将被编译,而在mypackage/p1/testpackage目录下的所有文件将不会被编译。编译后的.class文件将被保存到${build}目录下。
6、java
用于在当前的虚拟机(运行Ant的虚拟机)或者派生的另一个虚拟机中执行一个Java类
7、tstamp
在利用Ant编译打包工程时,有时候需要创建具有当前构件日期和时间的文件名,或者通过替换文件中的时间记号,来生成发行时间。这就需要<tstamp>任务来完成。
8、filter
可以通过替换文件中的时间记号,来生成发行时间,这种过滤功能由filter来设置
9、jar
用于创建Java归档文件
10、war
是jar任务的扩展,用于建立Web应用程序归档文件。
关于war文件
其实war文件就是Java中web应用程序的打包。借用一个老兄的话,“当你一个web应用程序很多的时候,如果你想把它部署到别的机器上,来回拷这些文件是件挺郁闷的事情,如果要是一个文件就好了。。。那么war文件就可以满足你这个小小的要求”。
那有人会说,这和直接打成rar文件不一样吗?区别大了!
如果你直接打成rar文件,你得手动的去解压缩,但是war文件不需要,你把它放到tomcat的webapp目录下,就可以直接运行了,我觉得这个功能够强大,哈哈。在tomcat安装目录下的conf目录下有个server.xml,搜索“unpackWARs”关键字,你会看到在<Host>标签中会有对其的设置,如果设置成true,那么tomcat在启动的时候,会在webapps目录下自动解压你那个war文件;如果设置成false,则tomcat直接访问war文件。
假如他的值是true,你的tomcat已经启动了,你把自动解压的文件夹删了,tomcat又会自动解压,我觉得它是实时的在检查,一旦没有,就会解压。
如何生成war文件呢:
1 | jar -cvf blog.war * |
查看war文件的方式:
1 | jar -tf blog.war |
11、echo
用于向监控台回送消息,这个任务也可以将消息回送到文件中。
部署到Tomcat
Tomcat对利用Ant实现自定义的部署提供了支持,部署任务包括部署、重新加载和卸载。
运行Ant
Ant的运行很简单,在正确安装Ant后,只要在命令行下输入Ant就可以了,Ant会在当前目录下查找build.xml文件。