Jenkins ant介紹(學習筆記五)

轉載自:https://www.cnblogs.com/pixy/p/4792887.html

Ant的由來(序)

James Duncan Davidson當年用純Java開發Tomcat的時候,不僅想讓它跨平臺運行,還想要在不同的操作系統上都能夠進行開發和構建。這種較大的項目的編譯構建過程是很復雜,需要用到很多工具和腳本(比如GNU make,Shell腳本,批處理文件等等)處理資源、處理依賴項、控制編譯過程、打包(Jar,War),某些特別的Java技術如EJB、RMI在編譯打包時還需要特別處理。James嘗試了很多工具和方案,最后的結論就是太TM難用了。

首先是慢。舉個栗子,編譯java代碼要用javac,javac其實就是包裝了下java用于編譯的Java工具類(JDK工具都是用純Java寫的,JDK目錄下的那些exe文件實際上都是調用Java類來實現具體功能的)。但是用make,shell這些工具每次調用javac,都要開新進程創建新的VM實例,如果每編譯一個文件調用一次javac,開銷就老大了,不慢才怪呢。調用命令后還必須要解析控制臺輸出信息才能知道執行情況,更不可能使用Java提供的異常和錯誤信息來確定執行狀態。

然后是累。make,shell腳本要跨平臺太困難,在不同的系統上要用不同的版本;而且要編寫shell腳本和make腳本(make只是shell基礎上的語言擴展),得有linux編程基礎,門檻還是比較高的;這類腳本編寫起來容易出錯(Makefile的tab問題能煩死人),難以調試。總之,如果構建過程用了一堆這樣的腳本,維護起來肯定是又煩又累。慢的問題還能通過一次編譯一批文件來緩解,但這個問題可就無解了。

James實在受不了了,就自己用Java開發了一個小工具,就是Ant,用來編譯和打包Java項目。構建中用到JDK中工具時都是直接調用Java類,而不是從命令行調用,慢的問題就解決了。構建中直接向Java編譯類提供或獲取數據,編譯過程中有什么問題,也能進行錯誤或異常處理。因為是用Java寫的,天然就是可以跨平臺的使用的。Ant從配置文件中讀取數據來控制構建過程,剛開始的時候用Properties文件,但是Properties文件難用表達比較復雜的層次結構關系,當他把Ant解決方案設計成"工程-目標-任務"的層次結構時,改用XML作為構建配置文件,XML文件是很好理解和掌握的,學習門檻變得非常低。再后來又利用反射功能,支持自定義任務,Ant的功能就不再僅限于構建Java項目了,可以使用在更廣泛的場合。至此Ant就基本成型了。

James完成這個工具之后,自己用著很爽并且在網上共享,然后就沒怎么再關注了,直到后來有一天忽然發現老多人都已經在用他的這個杰作了。James說他很慶幸當時沒有把精力一直花在這上面,否則可以能會不自覺的加入很多更本不必要的功能,讓Ant變得臃腫復雜,反而不好了。


這個故事除了說了Ant的來源和特點外,還有一點啟示:如果遇到問題,已有的工具都不能滿足需求,就應當另找一個。如果不存在這樣的工具,就自己動手創建一個。然后與大家共享,其他數以千計的人可能有著類似的難題。


第一章 Ant入門

ant的使用非常簡單:安裝好Ant后(最好配置Path環境變量),在構建文件中(默認名字為build.xml)配置好構建任務,然后調用ant命令,配置的任務就開始執行了。


1.編寫構建文件

創建一個用于編譯和打包Java項目的配置文件build.xml(名字可以隨便起,如mybuild.xml,執行的時候用-f 選項指定這個文件就可以):

這個配置文件很好理解,用任何文本編輯器都能編寫,只要保證是一個合法的XML文件并且用了正確的標簽和屬性,就可以使用ant運行。

根據這個配置文件就可以看出。Ant把任何任務都分成了3層。

最頂層的Project

目標Target(可以在ant命令中調用的基本單位)。如clean, compile, jar 等,在命令行可以這樣調用:ant clean或 ?ant clean jar。Target之間可以存在依賴關系,一個Target執行前會先執行它依賴的那些Target。Project可以設置一個默認的Targe, ant命令中不指定任何target時就調用這個默認的。

任務Task。

各種Task可以執行各種不同的具體任務。如mkdir, delete, javac, jar等。Task可以分3種,核心任務和可選任務有100多種,常用的功能全都覆蓋了

核心Task。Ant內置的任務

可選任務。第三方提供的,把相應的Jar包放到Ant安裝目錄的lib目錄下就能使用。

自定義任務

Task詳細說明可以查看官方文檔:http://ant.apache.org/manual/tasklist.html

Ant文件中還能用Property標簽配置屬性值,在定義之后的其他地方就可以引用,避免硬編碼。

所有的構建文件都要有且只能有一個元素,其中至少要有一個 元素。project的defualt屬性沒有默認值,如果這個屬性沒有設置,不指定Target運行ant不會調用任何target。


2.運行Ant

ant命令語法如下,詳細選項說明列在后面。

ant [option [option...]]? [target [target...]]


調用Ant時默認會在當前目錄中查找默認的構建文件名:build.xml。?

當然也可以用ant -f buildfile的方式手動指定構建文件(-f, -buildfile, -file都是等效的)。

調用Ant時可以指定一個或多個要執行的Target。如果不指定就調用Project標簽default屬性中配置的默認Target(上面這個例子中就是compile目標)。

以上面的構建配置文件為例,下面的幾種調用都可以:

ant調用默認構建文件(build.xml)中的默認目標(compile)ant -f mybuild.xml? jar調用構建文件mybuild.xml中的jar目標ant clean jar調用默認構建文件(build.xml)中的clean和jar目標。需要注意多個目標會按調用先后順序執行。如果調用ant jar clean就是先編譯打包(jar),然后全清理掉(clean),就白干了。

Ant執行時會按執行順序顯示每個Target的名字,也會顯示每個任務的名字([任務名])和任務中輸出的信息。直接調用ant的輸出結果為:

Buildfile: e:\wsJava\AntDemo\build.xml

clean:

? [delete] Deleting directory e:\wsJava\AntDemo\build

prepare:

? ? [mkdir] Createddir: e:\wsJava\AntDemo\build

? ? [mkdir] Createddir: e:\wsJava\AntDemo\build\classes

? ? [mkdir] Createddir: e:\wsJava\AntDemo\build\lib

compile:

? ? [javac] Compiling 2 sourcefilesto e:\wsJava\AntDemo\build\classes

jar:

? ? ? [jar] Building jar: e:\wsJava\AntDemo\build\lib\antDemo.jar

all:

BUILD SUCCESSFUL

Total time: 0 seconds

3.查看構建文件中所有目標

構建文件中的目標description屬性可有可無,除了方便人看外沒什么卵用。有沒有這個屬性叫法也不一樣的(沒有實際作用),有該屬性的叫主目標,沒有的叫子目標。下面這個命令可以列出構建文件中的所有目標和description信息。

ant [-f BUILDFILE] -projecthelp?


4.Ant命令選項

-h, ?-help ? 查看幫助信息

-p, ?-projecthelp ?查看構建文件中的所有目標信息

-version ?顯示Ant版本

-q, ?-quiet ? 抑制并非由構建文件中echo任務所產生的大多數輸出消息

-S, ?-silent ? 只顯示Task輸出和構建失敗信息

-v, ?-verbose ? 顯示構建過程中每個操作的詳細消息, 不能和-debug同時使用

-d, ?-debug ? ? 顯示Ant和任務開發人員已經標志位調試信息的消息。不能與-verbose同時使用

-e, ?-emacs ? ? 對日志消息進行格式化,使其能夠Emacs的shell模式解析。具體就是打印任務消息時不縮排也不輸出前面的 [任務名]

-diagnostics ? ?顯示對調試有用的信息

-f , ?-buildfile , -file 指定一個構建文件,而不是使用默認的build.xml

-D=通過命令行向構建過程中傳遞屬性值

-propertyfile 從property文件中加載屬性值并傳遞到構建過程

-s , ?-find ? ? 指定Ant應當使用的構建文件,如果指定的filename文件在當前目錄中沒找到,就到父目錄中進行搜索,直到到達文件系統的根,還找不到則構建失敗。

-k, ?-keep-going ? ?執行不依賴失敗目標的所有目標。

-lib ?指定查找jars和classes的目錄

-l ?, -logfile ? 將日志重定向到指定文件

-logger ? 指定一個類來處理Ant的日志記錄。該類必須實現了org.apache.tools.ant.BuildLogger接口

-listener ? 為Ant設置一個監聽類,將其增加到Ant的監聽器列表中。Ant與IDE或其他程序集成時非常有用,后面會專門寫這個。

-inputhandler ?指定用于處理輸入請求的類

-main ? 覆蓋Ant正常的入口點

-noinput ? ?不允許交互式輸入

-autoproxy ? Java1.5+,使用OS的代理設置

-nice number

-nouserlib

-noclasspath


第二章 安裝和配置

基本使用

下載ant發布包

解壓縮到一個目錄既可

將該目錄下的子目錄bin添加到PATH環境變量


高級配置

?留坑待填....


第三章 構建文件

構建文件需要根據具體項目的特性編寫,不過同一類型的項目基本上是可以使用一套構建配置的。

Java提供了用于構建的Java工具庫,使用Java語言編寫Ant是最容易實現和維護的。XML有豐富的解析類庫,并且被開發人員廣泛使用,也能夠表達Ant的數據模型,使用XML作為構建文件時最好的選擇。

XML是一種樹形的文檔對象模型(DOM),其中的Project,Target等元素與Ant的模型組件相對應。

1.Ant的構建塊

Project(工程) ??任何構建文件的第一個元素必須是標簽,而且只能有一個。

name屬性?工程的名字,也是構建文件的標識符。

default屬性?運行Ant不指定Target時,默認執行的Target。可以設置成一個構建文件中定義的Target名字。推薦默認Target顯示構建文件的幫助信息或者執行完成的構建。

basedir屬性?定義工程的根目錄,一般情況下都是" . ",也就是構建文件所在的目錄(不是運行Ant命令是的目錄)。在一個多層次的項目中,basedir還可以定義不同的參考點。


Target(目標)?一個Project可以包含多個Target,一個總的任務過程可以拆分成幾個target,每個Target可以單獨調用。可以把target理解成能夠單獨執行的一個個步驟(階段)。具體怎么拆分這個總任務,拆分粒度是粗還是細,把哪些Task放在哪幾個Target中,都是編寫構建文件要考慮的問題。一般來說,粒度更小可以更靈活的組合,有些target失敗也不會影響另一些的執行。但是粒度也不能太小,太小了會很瑣碎不好維護。

name屬性

depends屬性

description屬性

前面的build.xml實例中,編譯打包拆成了兩個target,如果每次這兩個target都是一起被調用的,把他們放在一個target中也是可以的。


Task(任務) ?任務是構建文件中的最小構建單位。通過Target把一個總過程組織成了幾個大的Target目標(步驟),但是Target并不做任何具體的工作,Target下面有包含一些Task,所有的具體工作都是靠這些task來完成。Ant提供非常多的Task,如編譯,大包,文件系統操作等等。Ant中每個任務對應于Ant對象模型中的一個Java對象,要自定義新的任務就是要編寫執行該任務類然后提供給Ant調用。很多系統命令也都是用Task包裝,而不是直接調用shell命令,在不同的操作系統上Task的使用方式是完全一致的。

構建文件中任務標簽內部也可以有很多層次。但是Task內部的這些層次結構和Java類的層次結構沒有任何關系了。

Task標簽不再有統一的屬性和子元素,內部層次完全取決于具體的任務。


2.數據元素(data element)

構建文件中除了與任務構建過程相關的元素外。還包括了保存數據的變量和抽象數據類型等元素。數據元素有兩類:Property和DataType

Property

表示字符串型的“鍵-值”對,只能用在可使用字符串的位置。

Propery和Java中的Property對象是兼容的,可以使用Property文件或JVM命令行-Dproperty=value選項,在運行ant時動態定義。

可以使用${propName}的形式引用Property數據。


property數據定義和引用


加載config.properties文件中定義的property數據


通過命令行在運行時動態定義propery數據

ant mytarget -Dname=value



DataType

Property數據值都是字符串,ant并不知道這些字符串代表了什么對象。如果將包含很多個Jar文件的長串路徑保存在Property數據中,就很容易出錯,修改也不方便。

Ant還提供了很多種具體的數據類型(DataType),各種數據類型能夠更清晰地描述特定類型的數據,如Path(路徑), FileSet(文件集合,可以使用通配符)等,修改起來更加方便。

使用Property表示路徑和使用Path/FileSet對象表示路徑的對比:

3.工程結構和構建文件

要編寫工程的構建文件,必須要了解項目的結構。項目類型不同,項目結構往往存在較大的差異(如Web項目和GUI項目),沒有最佳的工程組織模式。工程結構是比較復雜的,需要考慮跨平臺(使用相對路徑),依賴自包含無外部需求,功能模塊和不同類型文件分離等等。


以下面的項目結構為例:

projectName

build.xml ? ? ?構建文件

src/

api

module

doc/ ? ? ? 項目相關文檔(非JavaDoc文檔,不能自動生成),如readme,license等

lib/ ? ? ? ?依賴的外部庫,統一依賴

bin/   可選目錄,包含安裝、執行等腳本或者是難找的、定制的可執行工具(為跨平臺,最好不要使用可執行程序)

build/ ? ? 構建產出目錄

classes/

doc/ ? javadoc產出

lib/ ? ?

bin/

dist/ ? ? 最終用于發布的目錄(內容一般都是從其他目錄復制而來)

lib/

bin/

doc/

config/

?編寫構建文件

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,954評論 6 342
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,292評論 25 708
  • 老早,靜安寺一度是一座終年大門緊閉的倉庫,隔壁卻是間叫亞細亞的肉店,以至后來相當長一段時間,聽見亞洲的別稱“亞細亞...
    一頁閱讀 384評論 2 3
  • (上期膽碼0中.和值15中.跨度8中) 膽碼368.雙膽68.膽碼6. 定位:百位1236.十位0489.個位56...
    萱萱_eed9閱讀 218評論 0 0