學習Ant編譯指令碼

yangxi_001發表於2014-03-13

之前有了解到JAVA的編譯指令碼是Ant,當然現在有出來一個更加牛的Maven。其實指令碼這東西都是差不多的,我們先一步一步來學習Ant,以後再學習Maven、Rake。

之前在做Openfire(即時通訊伺服器)時使用過Ant,但是一直沒有時間去了解這個指令碼的具體工作原理。最近遇到一個問題:通過Eclipse編譯一個很大的Android工程非常的慢,因為裡面的資源比較多,而Eclipse的ADT需要對所有的資源進行重新的整理生成資源號,生成資源壓縮包。而且,有時候需要編譯幾個版本,需要對一個檔案的引數進行調整,經常會忘記這個事情,導致給客戶的APK不能使用。再則對檔案的“頻繁修改”使得git commit的東西多了,不理由對版本歷史的檢視。於是,決定利用點業餘的時間好好學習一下Ant。

 以上是我對Ant的瞭解和需求。下面是我一步一步的學習過程。

瞭解Ant的歷史,What's Ant

原來Ant是Apache的一個子專案http://ant.apache.org/,當然也就是開源的。Ant是用Java寫的,目前的主要用途是編譯Java的應用。Ant會包含很多的Task和Type,第三方有一些庫提供了一些這樣的Task和Type主要是方面我們在特定場景的使用。Google一下,果然發現以Android方面的antlibhttp://code.google.com/p/autoandroid/wiki/AndroidAnt。所謂的這些lib,就是進行了再次的抽象,把我們要做的事情簡單化了。但是,我們一定要知其然知其所以然。一定要搞明白背後的原理,而不是照著別人的命令敲就是了,那是很沒出息的。而且萬一遇到個啥問題也沒有辦法自己解決,又要去網上“跪求”了。

相關文件

http://ant.apache.org/manual/

官方的文件是很好的學習材料,當然由於是英文的,寫的也比較全面,花的時間會比較多。如果你是想速成的話,可以找個demo來學習,然後依葫蘆畫瓢。在工作中經常為了趕專案經常要做這樣的事情。但是我不提倡這種方便麵的學習方法。

官方文件介紹瞭如何安裝Ant,相信這對大家沒有問題,有疑問再聯絡我。

接下來,我們跟這文件一步一步來學習。

Hello World

在上面的官方文件中有Hello World的例項,叫我們一步一步的跟著學習。http://ant.apache.org/manual/ -->Tutorials --> Hello World with Apache Ant。你也可以先看看Ant的幾個基本的概念,下面會做簡單的介紹。熟悉或者簡單瞭解這些基本的概念對學習hello world有幫助,或者交替的看,反覆的看。將這兩者理解好了,就入門了,甚至你比一些copy著用了很多年Ant的人還厲害。因為你瞭解其中的原理,你可以通過這些原理分析出現的問題。

基本概念

Projects
每一個build.xml只有一個Project,Project表示一個工程吧,裡面可以知道這個工程的全域性屬性。這個比較固定,照寫就可以。如下:
[html] view plaincopy
  1. <project name="helloWorld" basedir="." default="main">  
  2. ......  
  3. <target name="main" depends="clean,run"/>  
  4. </project>  
熟悉name順便定義一個就行。basedir指定相對路徑的基礎,這裡是指定了當前路徑。default是指如果執行ant時不指定哪一個target時,就使用這個預設的。
Targets
target翻譯過來就是目標吧,每一個project都會包含很多的目標,例如編譯/compile、執行/run、清理clean、打包/package等等。特別是打包,我們可能要針對不同的客戶打不同的包給他們,這時候就顯得得心應手了。例子如下:
[html] view plaincopy
  1. <target name="run" depends="jar">  
  2.        <java fork="true" classname="${main-class}">  
  3.            <classpath>  
  4.                <path refid="classpath"/>  
  5.                <path location="${jar.dir}/${ant.project.name}.jar"/>  
  6.            </classpath>  
  7.        </java>  
  8. </target>  

屬性name是這個target的名字,可以被其它的target引用。我們看depends的熟悉,jar就是另外一個target的name。depends是指定target之間的依賴關係,這樣就省去我們很多的麻煩。例如,在run之前,需要先執行compile這個target,否則就沒有東西可以run了。通過depends的指定,我們在想run的時候就run吧,Ant自然會根據我們的depends先執行其它的依賴,省心省力。
Tasks

而要實現一個目標,需要執行很多的任務的,因此Tasks是被包含在Targets裡面的。從上面的例子可以看到,<java />這個元素就是一個task。這是編寫build.xml的關鍵,因為這個才是真正被執行的。Ant內建了很多的Task,如複製檔案,刪除資料夾,壓縮檔案等等,下面的連結http://ant.apache.org/manual/tasklist.html包含了所有的。平時使用的時候可以隨時檢視。

Properties
property相對於C++裡面的巨集吧,或者Java中的constant。這是一個key-value的形式出現的。這個key可以在其它地方中引用,通過${key}這種形式。如:
[html] view plaincopy
  1. <property name="build.dir" location="build"/>  
  2. <target name="init">  
  3.       <mkdir dir="${build.dir}"/> //建立路徑  
  4. </target>  
這個${build.dir}現在是代表了build這個相對路徑資料夾,我還可以在不改變build.xml的情況下,通過Ant的執行引數來改變這個值。如Ant -Dbuild.dir = build-debug。

看看別人的文章

到此,也學習差不多了,當然這裡的差不多是指入門。實際的應用還有很多細節的問題需要不斷的查詢資料。現在我們就看看,別人學習Ant的情況,來Google一下。
  1. http://blog.csdn.net/pq5326/article/details/337242
  2. http://www.blogjava.net/atealxt/archive/2008/07/17/ant_study_note.html
  3. http://www.blogjava.net/bingle/archive/2007/01/23/95479.html
  4. http://lingate.iteye.com/blog/28651

自己仔細看看,有哪些自己知道了的,哪些掌握了的,哪些還需要學習的。有疑問的地方可以跟他們探討一下。

Google時候還發現Ant方面的經典書籍《Ant Definitive Guide》這些可以作為後續的深入學習材料,或者解決問題的好幫手。

總結

如果你跟這上面的步驟進行學習,相信一定會有所地的。同時,這裡面不單讓你學會了Ant,更加重要的是告訴你學習一個知識點的方法。

相關文章