ANT速写
一、为什么使用ANT
当一个代码项目大了以后,每次重新编译,打包,测试等都会变得非常复杂而且重复,因此c语言中有make脚本来帮助这些工作的批量完成。在Java 中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些。
概念到处都是,随处可查。ant就是一个构建工具,又不局限于构建。
什么是构建?
形象来说,就是把代码从某个地方拿来,编译,再拷贝到某个地方去运行等等操作。
什么叫不局限于构建?
ant主要用来做构建,但它能做的还有很多,可能你用了很久,依然不知道它到底有多少功能。ant插件让ant的功能丰富多彩,例如我们后面演示的“生成hibernate映射文件,配置文件”等
准备工作:
1、安装jdk,配置java_home,path,class_path。如果你连这些还不清楚,那就先不要学ant了。
2、下载解压ant,搜ant,官网下载,然后解压即可。我这里用的是1.9.0
3、设置ant_home,path中添加ant_home下的bin
4、开始-运行-cmd-ant-回车
如果看到Buildfile:build.xml does not exist! bulid failed
那么表示ant安装成功!
二、ANT测试
1、基本元素
bulid.xml
<?xml version="1.0" encoding="GBK"?> <project name="ant测试" default="getBaseDir" basedir="D:\antTest"> <!--基本元素--> <target name="getBaseDir"> <description> the first example! </description> <echo message="hello world!" /> </target> <target name="targetA" if ="ant.version"> <echo message ="Java Version: ${ant.version}"/> </target> <target name="targetB" if ="ant.java.version"> <echo message ="Java Version: ${ant.java.version}"/> <echo message ="Java Version: ${ant.file}"/> <echo message ="Java Version: ${ant.version}"/> </target> <target name="targetC" depends ="targetA" unless ="anotherTarget" > <description> show depends,unless,basedir,if </description> <echo message ="The base dir is: ${basedir}"/> </target> <!--property--> <property name="name" value="jim" /> <property name="age" value="18" /> <target name="targetD" > <echo message="name:${name},age:${age}" /> </target> <!--echo--> <target name="targetEcho"> <echo message="Hello,ANT" file="herfile/hello.log" append="true" /> </target> </project>
project 元素是 Ant 构件文件的根元素, Ant 构件文件至少应该包含一个 project 元素,否则会发生错误。在每个 project 元素下,可包含多个 target 元素。
1) name 属性
用于指定 project 元素的名称。
2) default 属性
用于指定 project 默认执行时所执行的 target 的名称。
3) basedir 属性
用于指定基路径的位置。该属性没有指定时,使用 Ant 的构件文件的附目录作为基准目录。
target 元素
target为Ant的基本执行单元,它可以包含一个或多个具体的任务。多个target 可以存在相互依赖关系。它有如下属性:
1) name 属性
指定 target 元素的名称,这个属性在一个 project 元素中是唯一的。我们可以通过指定 target 元素的名称来指定某个 target 。
2) depends 属性
用于描述 target 之间的依赖关系,若与多个 target 存在依赖关系时,需要以“,”间隔。 Ant 会依照 depends 属性中 target 出现的顺序依次执行每个 target 。被依赖的 target 会先执行。
3) if 属性
用于验证指定的属性是否存在,若不存在,所在 target 将不会被执行。
4) unless 属性
该属性的功能与 if 属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在 target 将会被执行。
5) description 属性
该属性是关于 target 功能的简短描述和说明。
property 元素
property元素可看作参量或者参数的定义,project 的属性可以通过 property 元素来设定,也可在 Ant 之外设定。若要在外部引入某文件,例如 build.properties 文件,可以通过如下内容将其引入:
<propertyfile=” build.properties”/>
2、常用命令
build.xml
<?xml version="1.0" encoding="GBK"?> <project name="ant测试" default="getBaseDir" basedir="D:\antTest"> <!--常用命令--> <!--copy--> <target name="targetCopy"> <copy file="myfile/hello.txt" tofile="herfile/copied.txt"/> <copy todir="hisfile"> <fileset dir="myfile"/></copy> </target> <!--delete--> <target name="targetDelete"> <delete file="myfile/hello.txt" /> <delete dir="myfile" /> <delete includeEmptyDirs="true"> <fileset dir="." includes="**/*.bak" /> </delete> </target> <!--mkdir--> <target name="targetMkdir"> <mkdir dir="/myfile/src/build/classes"/> </target> <!--move--> <target name="targetMove"> <move file="destfile.txt" tofile="hello.txt"/> <move file="hello.txt" todir="myfile"/> <move todir="herfile"> <fileset dir="myfile"/></move> </target> </project>
copy命令用来对文件和目录的复制功能。
delete 命令对文件或目录进行删除
mkdir 命令创建目录
move 命令移动文件或目录
3、常用target
举例:j2ee项目打包发布,hibernate相关文件生成
<?xml version="1.0" encoding="GBK"?> <project name="测试ANT" basedir="."> <!--资源文件位置--> <property name="src.dir" value="${basedir}/src" /> <!--编译的目标位置--> <property name="classes" value="${basedir}/build/classes" /> <!--打包的目标位置--> <property name="build" value="${basedir}/build" /> <!--Lib的位置--> <property name="lib" value="${basedir}/WebContent/WEB-INF/lib" /> <!--tomcat.webapps位置--> <property name="webapps" value="D:/tomcate/apache-tomcat-7.0.39/webapps" /> <!--Xdoclet.Home--> <property name="xdoclet.home" value="D:/oa/xdoclet-plugins-1.0.3" /> <!-- Build classpath 指定定lib所在位置--> <path id="classpath"> <fileset dir="${lib}"> <include name="*.jar" /> </fileset> </path> <!-- 删除build 路径--> <target name="删除build 路径"> <delete dir="${build}" /> </target> <!-- 建立build/classes 路径,并编译class 文件到build/classes 路径下--> <target name="建立build/classes 路径,并编译class 文件到build/classes 路径下" depends="删除build 路径"> <mkdir dir="${classes}" /> <javac srcdir="${basedir}/src" destdir="${classes}"> <classpath refid="classpath" /> </javac> <copy todir="${classes}"> <fileset dir="${src.dir}"> <include name="**/*.xml" /> <include name="**/*.properties" /> </fileset> </copy> </target> <!-- 打war 包--> <target name="打war 包" depends="建立build/classes 路径,并编译class 文件到build/classes 路径下"> <war destfile="${build}/WebTest1.war" webxml="${basedir}/WebContent/WEB-INF/web.xml"> <!-- 拷贝WebContent下所有文件--> <fileset dir="${basedir}/WebContent" /> <!-- 拷贝lib 目录下的jar 包--> <lib dir="${lib}" /> <!-- 拷贝build/classes 下的class 文件--> <classes dir="${classes}" /> </war> <delete dir="${classes}" /> </target> <!--发布到本地tomcat--> <target name="发布到本地tomcat" depends="打war 包"> <copy file="${build}/WebTest1.war" tofile="${webapps}/WebTest1.war" /> </target> <!-- Build classpath --> <path id="xdoclet.task.classpath"> <fileset dir="${xdoclet.home}/lib"> <include name="**/*.jar" /> </fileset> <fileset dir="${xdoclet.home}/plugins"> <include name="**/*.jar" /> </fileset> </path> <taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="xdoclet.task.classpath" /> <!--生成Hibernate配置文件--> <target name="生成Hibernate配置文件" depends="生成hibernate映射文件"> <xdoclet> <fileset dir="${src.dir}/com/jialin/model"> <include name="**/*.java" /> </fileset> <component classname="org.xdoclet.plugin.hibernate.HibernateConfigPlugin" destdir="${src.dir}" version="3.0" hbm2ddlauto="update" jdbcurl="jdbc:mysql://127.0.0.1/oa" jdbcdriver="com.mysql.jdbc.Driver" jdbcusername="root" jdbcpassword="123456" dialect="org.hibernate.dialect.MySQLDialect" showsql="true" /> </xdoclet> </target> <!--生成hibernate映射文件--> <target name="生成hibernate映射文件"> <xdoclet> <fileset dir="${src.dir}/com/jialin/model"> <include name="**/*.java" /> </fileset> <component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin" version="3.0" destdir="${src.dir}" /> </xdoclet> </target> </project>
说明见注释吧。
注:在eclipse里边先天支持ant,所以你可以在eclipse里边直接写build.xml,因为eclipse提供了提示功能,自动补充功能,它能让你事半功倍。
使用方法:只需要建立一个工程,然后建立一个叫build.xml的文件。然后就可以在里边写你的ant build了。
总结:
掌握了上边的那些内容之后,你就知道如何去写一个好的ant,但是你会发现当你真的想去做的时候,你不能马上作出好的build.xml,因为你知道太少的ant
的默认提供的命令.这个时候如果你想完成任务,并提高自己,有很多办法:
1、很多开源的程序都带有build.xml,看看它们如何写的
2、ant的document,里边详细列写了ant的各种默认命令,及其丰富
3、google,永远不要忘记它
4、时刻记住http://www.apache.org/永远能找到你需要的东西
随着你写的ant build越来越多,你知道的命令就越多,ant在你的手里也就越来越强大了,这个是一个慢慢积累的过程。