Ant與批處理(win環境)學習筆記

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.