背景:最近个人附带的负责维护测试服务环境,每天早上的过程大致如下:
远程登录到主机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>