背景:最近個人附帶的負責維護測試服務環境,每天早上的過程大致如下:
遠程登入到主機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>