Ant 自动化构建技术
前言
很早就很想了解一下ant自动化构建技术,工作中确实也用到过ant,只不过都是用它作为一种辅助工具来编译一些开源项目,没有真正的去自己
动手去建立自己的工程,然后使用ant来为自己的工程服务,定制发布的目录结构.
这几天花了点时间去研究了下ant,发现这款工具着实不错,特别是在没有插件的IDE诸如Eclipse下工作,ant确实帮了很多忙.Ant使得我们可以
定制自己的开发工程目录,并配合jdk完成对工程的打包,发布.我们不必去比较它与Maven的孰优孰劣,工具或者技术都是为了服务一个群体或者对象,
每个人的使用习惯,兴趣爱好各异,只要能够高效的达成自己的目标,这样比什么都强,我从来都是实用主义的拥护者。
正文
先将自己的工程目录展示下,这里以一个完整的web项目为例:
build.xml 长成这样:
<?xml version="1.0" encoding="GBK"?>
<!--工程名 工程所在的基目录-->
<project name="demo" basedir="." default="all">
<!-- 工程目录特性-->
<!--src 存放源代码-->
<property name="src.dir" value="src"/>
<!--doc 存放项目文档-->
<property name="doc.dir" value="doc"/>
<!--lib 存放第三方依赖包-->
<property name="lib.dir" value="lib"/>
<!-- dist 存放发布包-->
<property name="dist.dir" value="dist"/>
<!-- bin 存放可执行文件,脚本等-->
<property name="bin.dir" value="bin"/>
<!-- web项目发布目录-->
<property name="demo.dir" value="${dist.dir}/demo"/>
<!-- bulid 临时目录-->
<property name="build.dir" value="build"/>
<property name="build.classes" value="${build.dir}/classes"/>
<property name="build.lib" value="${build.dir}/lib"/>
<property name="build.doc" value="${build.dir}/doc"/>
<property name="debug.flag" value="on"/>
<!--设置classpath,加载第三方依赖包-->
<path id="classpath">
<!--dir 表示依赖包所在的目录
包含所有lib目录下所有的jar文件
**: 与0 或者多个目录相匹配
* : 与0 或者多个字符相匹配
-->
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>
<!-- 创建临时目录-->
<target name="prepare">
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.classes}"/>
<mkdir dir="${build.lib}"/>
<!--记录构建时间戳-->
<tstamp/>
<echo message="${TSTAMP}"/>
</target>
<!--编译,打包-->
<target name="bot" depends="prepare">
<!--debug : 编译时,是否打开调试开关-->
<javac destdir="${build.classes}" debug="${debug.flag}">
<!--要编译的源代码目录-->
<src path="${src.dir}/java"/>
<!--不包含的目录文件-->
<classpath refid="classpath"/>
</javac>
<!--打包 jarfile 打包后的jar包名称-->
<jar jarfile="${build.lib}/demo.jar" basedir="${build.classes}">
<!--
<exclude name="demo/modules/**"/>
-->
</jar>
</target>
<!--发布-->
<target name="deploy" depends="bot,javadoc">
<!--创建发布目录-->
<mkdir dir="${dist.dir}"/>
<!--
<mkdir dir="${dist.dir}/bin"/>
<mkdir dir="${dist.dir}/lib"/>
<mkdir dir="${dist.dir}/doc"/>
<mkdir dir="${dist.dir}/config"/>
-->
<mkdir dir="${demo.dir}"/>
<!-- 拷贝src/web 下的所有文件到 demo 目录下-->
<copy todir="${demo.dir}">
<fileset dir="${src.dir}/web" includes="**"/>
</copy>
<!-- copy lib 目录到WEB-INF 下 -->
<copy todir="${demo.dir}/WEB-INF">
<!-- copy 的时候,如果目标目录(lib)不存在,则连带源目录(lib)一并拷贝-->
<fileset dir="." includes="${lib.dir}/*.jar"/>
<!-- -->
</copy>
<!-- 将本应用demo的jar包copy到WEB-INF/lib 目录下-->
<!--
<copy todir="${demo.dir}/WEB-INF/lib">
<fileset dir="${build.dir}/lib" includes="demo.jar"/>
</copy>
-->
<!-- 拷贝build/classes编译的所有类文件到WEB-INF 下-->
<copy todir="${demo.dir}/WEB-INF">
<fileset dir="${build.dir}" includes="classes/**/*.*"/>
</copy>
<!-- copy src 目录下所有的资源文件到classes 目录下-->
<copy todir="${demo.dir}/WEB-INF/classes">
<fileset dir="${src.dir}/resource" includes="**/*.*"/>
</copy>
</target>
<!--java doc 文档的生成非常慢,在构建时需要考虑这些-->
<target name="javadoc" depends="bot">
<mkdir dir="${doc.dir}/api"/>
<javadoc packagenames="com.*" sourcepath="${src.dir}/java" destdir="${doc.dir}/api" author="true" version="true">
<classpath refid="classpath"/>
</javadoc>
</target>
<!--清理:只清理class类文件的情况-->
<target name="clean">
<delete>
<fileset dir="${build.classes}" includes="**/*.class"/>
</delete>
</target>
<!--清理:还原到构建前的状态-->
<target name="cleanall" depends="clean">
<delete dir="${build.dir}"/>
<delete dir="${dist.dir}"/>
<delete dir="${doc.dir}"/>
</target>
<target name="all" depends="cleanall,deploy"></target>
</project>
build之后,dist目录就包含了本次要发布的web项目:
参考书目:《Ant 权威指南》
读后感: 读这本书的前三章就足够了,其它的章节可以作为手册来查阅,遇到问题再看也不完.