背景:最近个人附带的负责维护测试服务环境,每天早上的过程大致如下: 远程登录到主机438——进入构建目录——删除Cloud和dist两个文件夹——进入ant目录——键入build开始构建(由于系统很大一般要12分钟)——构建完成之后打开SSH File Transfer将新构建的连个文件夹上传到Rhel服务器——在Rhel中启动cloud和dc。 刚开始还好,搞得天数多了难免不生厌,于是想如何使上述这一过程做到最大程度的自动化呢? 想到的一种实现方式: a、将build做成随机启动(因服务器一般都不关闭的,因此考虑做成定时的)(写.cmd脚本) b、将删除与上传工的作放进构建脚本中(修改ant脚本) 于是开始行动, 先去系统地学习一下ant的使用... ... ————————Ant学习之简单Demo—————— 一、基本概念 1、什么是Ant 2、什么是构建 3、使用Ant的优势(相对于make而言) .跨平台 .使用简单 .语法清晰 .功能强大 二、Ant安装 1、http://ant.apache.org/bindownload.cgi下载Ant,当前最新版本为1.8.1 2、 与配置Jdk的环境类似,新建一个变量:ANT_HOME=ant所在目录 设置Path为: %ANT_HOME%/bin 注意:如果要让Ant能够支持Junit,需要将JUnit的junit.jar放置在Ant的lib目录并记得修改ClassPath中原有关Junit的设定。 3、 进入CMD界面,键入ant -v 若出现有关版本的提示则表明你的安装成功了。 好了,让我们开始进入Ant的编写... ... 三、Ant简单Demo 目的: 使用Ant来达成目的,完成一件事情的实例 .编写一个程序 .编译它们 .把它们打成jar包 .设定它们的存放位置 .运行它们 1、首先写一个HelloWorld.java
package test.ant; public class HelloWorld { public static void main(String[] args) { System.out.println("Welcome to The Ant World"); } }2、 撰写构建脚本build.xml
<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorld" default="run" basedir="."> <property name="src" value="src"/> <property name="dest" value="classes"/> <property name="hello_jar" value="hello1.jar"/> <target name="init"> <mkdir dir="${dest}"/> </target> <target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}" includeantruntime="false"/> </target> <target name="build" depends="compile"> <jar jarfile="${hello_jar}" basedir="${dest}"/> </target> <target name="run" depends="build"> <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/> </target> <target name="clean"> <delete dir="${dest}"/> <delete file="${hello_jar}"/> </target> <target name="return" depends="clean,run"> <ant target="clean"/> <ant target="run"/> </target> </project>3、解读脚本 把你想做的每一件事情写一个target,depends是它所依赖的target,在执行当前的target之前必须先执行depends中所定义的target。 注意:上述脚本中return这个target是一个特殊的target,相当于还原 4、执行 键入ant,你会发现你所定义的一个个任务都已经完成。有时我们可能并不想执行程序,只是想执行其中的某些步骤,那么你可以采取如下的做法: ant targetName 即可,如我只执行clean就键入 ant clean ^_^ ^_^ Demo至此完工,休息一下,继续后面的学习... ... 途中遇到的问题: 1、 ant warning:'includeantruntime' was not set,defaulting to build.sysclasspath=last;set to false for repeatable builds 解决方案:在javac标签中加入属性includeantruntime="false" 便可以了 —————————Ant学习之Ant整合———————————— 背景:我们目前的项目一共分成了8个模块,共13个小工程,不同的小组负责不同的模块或者工程,为了测试,各个小组都是自己写的build.xml,而我作为测试维护人员负责把这些模块组合到一块使用。写一个build.xml,这时我就惆怅了: 1、重新写一个build.xml?——这貌似很麻烦 2、 尽量利用同事已经写好的build.xml,减少自己的工作 也正因为决定采取第二种方式,现在开始学习Ant整合 ——————————————————————————————————————————————————————————— 假设只有3个模块,每个小组负责一个模块,他们分别有一个src和写好的build.xml。此时你拿到他们的src,你需要做的是建立三个文件夹src1,src2,src3并分别把他们的src和build.xml合并写一个新的build.xml。
<?xml version="1.0" encoding="UTF-8"?> <project name="main" default="build" basedir="."> <property name="bin" value="${basedir}/bin"/> <property name="src1" value="${basedir}/src1"/> <property name="src2" value="${basedir}/src2"/> <property name="src3" value="${basedir}/src3"/> <target name="init"> <mkdir dir="${bin}"/> </target> <target name="run"> <ant dir="${src1}" target="run"/> <ant dir="${src2}" target="run"/> <ant dir="${src3}" target="run"/> </target> <target name="clean"> <ant dir="${src1}" target="run"/> <ant dir="${src2}" target="run"/> <ant dir="${src3}" target="run"/> </target> <target name="build" depends="init"> <copy todir="${bin}"> <fileset dir="${src1}"> <include name="*.jar"/> </fileset> <fileset dir="${src2}"> <include name="*.jar"/> </fileset> <fileset dir="${src3}"> <include name="*.jar"/> </fileset> </copy> </target> <target name="rebuild" depends="build,clean"> <ant target="clean"/> <ant target="build"/> </target> </project>OK,你的任务完成了! ——————————Ant进阶学习—————————— 如你所见,上述做法还是存在很大的问题,重点体现在重复性的东西比较多,每次修改一个目录导致要修改多处,是否能让工作做得更好一点呢? 引入两个东西: 1、property 2、xml include 这两个东西都有一个功能,就是能把build.xml中</property>分离出来共同使用。 差异: property的特点是维护简单,只需要简单的键值对 xml include的特点是不但可以提取出属性,连target也可以提取 —————————————————————————————————————— 继续上述例子,如我们想把src1 src2 src3这三个属性从xml中提出来,可以新建一个all.properties,里面的内容如下: src1=文件位置... src2=文件位置... src3=文件位置 然后你的build.xml可以这样写,别人只需要修改你的配置文件all.properties而不需修改你的build.xml:
<?xml version="1.0" encoding="UTF-8"?> <project name="main" default="build" basedir="."> <property name="bin" value="${basedir}/bin"/> <property file="all.properties"/> <target name="init"> <mkdir dir="${bin}"/> </target> <target name="run"> <ant dir="${src1}" target="run"/> <ant dir="${src2}" target="run"/> <ant dir="${src3}" target="run"/> </target> <target name="clean"> <ant dir="${src1}" target="run"/> <ant dir="${src2}" target="run"/> <ant dir="${src3}" target="run"/> </target> <target name="build" depends="init"> <copy todir="${bin}"> <fileset dir="${src1}"> <include name="*.jar"/> </fileset> <fileset dir="${src2}"> <include name="*.jar"/> </fileset> <fileset dir="${src3}"> <include name="*.jar"/> </fileset> </copy> </target> <target name="rebuild" depends="build,clean"> <ant target="clean"/> <ant target="build"/> </target> </project>有时候你想给每个小组的build.xml中添加几个target,一种做法是每个build.xml中写入target,但是有一种更好的做法: 你可以写一个include.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <property name="src" value="src"/> <property name="dest" value="classes"/> <target name="test"> <ant target="run"/> </target> </xml>然后你可以按如下方式更改你的每个build.xml,在每个build.xml中写入:
<!-- include a xml file, it can be common property, can be also a target --> <!DOCTYPE project[ <!ENTITY share-variable SYSTEM "file:../include.xml"> ]>然后再在build.xml中的<project></project>之间写入 &share-variable;即可 如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- include a xml file, it can be common property, can be also a target --> <!DOCTYPE project[ <!ENTITY share-variable SYSTEM "file:../include.xml"> ]> <project name="HelloWorld" default="run" basedir="."> <!--use the include --> &share-variable; <!--define the property --> <!-- via include <property name="src" value="src"/> <property name="dest" value="classes"/> --> <property name="hello_jar" value="hello1.jar"/> <!--define op --> <target name="init"> <mkdir dir="${dest}"/> </target> <target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}" includeantruntime="false"/> </target> <target name="build" depends="compile"> <jar jarfile="${hello_jar}" basedir="${dest}"/> </target> <target name="run" depends="build"> <java classname="test.ant.HelloWorld" classpath="${hello_jar}"/> </target> <target name="clean"> <delete dir="${dest}"/> <delete file="${hello_jar}"/> </target> <target name="return" depends="clean,run"> <ant target="clean"/> <ant target="run"/> </target> </project>