ant命令總結(jié)范文.doc_第1頁
ant命令總結(jié)范文.doc_第2頁
ant命令總結(jié)范文.doc_第3頁
ant命令總結(jié)范文.doc_第4頁
ant命令總結(jié)范文.doc_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

ant命令總結(jié)范文 ant命令總結(jié)1Ant是什么?Apache Ant是一個(gè)基于Java的生成工具。 生成工具在軟件開發(fā)中用來將源代碼和其他輸入文件轉(zhuǎn)換為可執(zhí)行文件的形式(也有可能轉(zhuǎn)換為可安裝的產(chǎn)品映像形式)。 隨著應(yīng)用程序的生成過程變得更加復(fù)雜,確保在每次生成期間都使用精確相同的生成步驟,同時(shí)實(shí)現(xiàn)盡可能多的自動(dòng)化,以便及時(shí)產(chǎn)生一致的生成版本2下載、安裝Ant安裝Ant下載.zip文件,解壓縮到c:ant1.3(后面引用為%ANT_HOME%)2.1在你運(yùn)行Ant之前需要做一些配置工作。 ?將bin目錄加入PATH環(huán)境變量。 ?設(shè)定ANT_HOME環(huán)境變量,指向你安裝Ant的目錄。 在一些OS上,Ant的腳本可以猜測(cè)ANT_HOME(Unix和Windos NT/2000)但最好不要依賴這一特性。 ?可選地,設(shè)定JAVA_HOME環(huán)境變量(參考下面的高級(jí)小節(jié)),該變量應(yīng)該指向你安裝JDK的目錄。 注意不要將Ant的ant.jar文件放到JDK/JRE的lib/ext目錄下。 Ant是個(gè)應(yīng)用程序,而lib/ext目錄是為JDK擴(kuò)展使用的(如JCE,JSSE擴(kuò)展)。 而且通過擴(kuò)展裝入的類會(huì)有安全方面的限制。 2.2運(yùn)行Ant運(yùn)行Ant非常簡單,當(dāng)你正確地安裝Ant后,只要輸入ant就可以了。 ?沒有指定任何參數(shù)時(shí),Ant會(huì)在當(dāng)前目錄下查詢build.xml文件。 如果找到了就用該文件作為buildfile。 如果你用-find選項(xiàng)。 Ant就會(huì)在上級(jí)目錄中尋找buildfile,直至到達(dá)文件系統(tǒng)的根。 要想讓Ant使用其他的buildfile,可以用參數(shù)-buildfile file,這里file指定了你想使用的buildfile。 ?可以指定執(zhí)行一個(gè)或多個(gè)target。 當(dāng)省略target時(shí),Ant使用標(biāo)簽的default屬性所指定的target。 命令行選項(xiàng)總結(jié)antoptionstargettarget2target3.Options:-help printthis message-projecthelp printproject helpinformation-version printthe versioninformation andexit-quiet beextra quiet-verbose beextra verbose-debug printdebugging information-emacs producelogging informationwithout adornments-logfile fileuse givenfile forlog output-logger classnamethe classthat isto performlogging-listener classnameadd aninstance ofclass asa projectlistener-buildfile fileuse specifiedbuildfile-find filesearch forbuildfile towardsthe rootof thefilesystem anduse thefirst onefound-Dproperty=value setproperty tovalue例子ant使用當(dāng)前目錄下的build.xml運(yùn)行Ant,執(zhí)行缺省的target。 ant-buildfile test.xml使用當(dāng)前目錄下的test.xml運(yùn)行Ant,執(zhí)行缺省的target。 ant-buildfile test.xml dist使用當(dāng)前目錄下的test.xml運(yùn)行Ant,執(zhí)行一個(gè)叫做dist的target。 ant-buildfile test.xml-Dbuild=build/classes dist使用當(dāng)前目錄下的test.xml運(yùn)行Ant,執(zhí)行一個(gè)叫做dist的target,并設(shè)定build屬性的值為build/classes。 3編寫build.xml Ant的buildfile是用XML寫的。 每個(gè)buildfile含有一個(gè)project。 buildfile中每個(gè)task元素可以有一個(gè)id屬性,可以用這個(gè)id值引用指定的任務(wù)。 這個(gè)值必須是唯一的。 (詳情請(qǐng)參考下面的Task小節(jié))3.1Projects project有下面的屬性Attribute DescriptionRequired name項(xiàng)目名稱.No default當(dāng)沒有指定target時(shí)使用的缺省target Yesbasedir用于計(jì)算所有其他路徑的基路徑。 該屬性可以被basedir property覆蓋。 當(dāng)覆蓋時(shí),該屬性被忽略。 如果屬性和basedir property都沒有設(shè)定,就使用buildfile文件的父目錄。 No項(xiàng)目的描述以一個(gè)頂級(jí)的元素的形式出現(xiàn)(參看description小節(jié))。 一個(gè)項(xiàng)目可以定義一個(gè)或多個(gè)target。 一個(gè)target是一系列你想要執(zhí)行的。 執(zhí)行Ant時(shí),你可以選擇執(zhí)行那個(gè)target。 當(dāng)沒有給定target時(shí),使用project的default屬性所確定的target。 3.2Targets一個(gè)target可以依賴于其他的target。 例如,你可能會(huì)有一個(gè)target用于編譯程序,一個(gè)target用于生成可執(zhí)行文件。 你在生成可執(zhí)行文件之前必須先編譯通過,所以生成可執(zhí)行文件的target依賴于編譯target。 Ant會(huì)處理這種依賴關(guān)系。 然而,應(yīng)當(dāng)注意到,Ant的depends屬性只指定了target應(yīng)該被執(zhí)行的順序如果被依賴的target無法運(yùn)行,這種depends對(duì)于指定了依賴關(guān)系的target就沒有影響。 Ant會(huì)依照depends屬性中target出現(xiàn)的順序(從左到右)依次執(zhí)行每個(gè)target。 然而,要記住的是只要某個(gè)target依賴于一個(gè)target,后者就會(huì)被先執(zhí)行。 假定我們要執(zhí)行target D。 從它的依賴屬性來看,你可能認(rèn)為先執(zhí)行C,然后B,最后A被執(zhí)行。 錯(cuò)了,C依賴于B,B依賴于A,所以先執(zhí)行A,然后B,然后C,最后D被執(zhí)行。 一個(gè)target只能被執(zhí)行一次,即時(shí)有多個(gè)target依賴于它(看上面的例子)。 如果(或如果不)某些屬性被設(shè)定,才執(zhí)行某個(gè)target。 這樣,允許根據(jù)系統(tǒng)的狀態(tài)(java version,OS,命令行屬性定義等等)來更好地控制build的過程。 要想讓一個(gè)target這樣做,你就應(yīng)該在target元素中,加入if(或unless)屬性,帶上target因該有所判斷的屬性。 例如如果沒有if或unless屬性,target總會(huì)被執(zhí)行。 可選的description屬性可用來提供關(guān)于target的一行描述,這些描述可由-projecthelp命令行選項(xiàng)輸出。 將你的tstamp task在一個(gè)所謂的初始化target是很好的做法,其他的target依賴這個(gè)初始化target。 要確保初始化target是出現(xiàn)在其他target依賴表中的第一個(gè)target。 在本手冊(cè)中大多數(shù)的初始化target的名字是init。 target有下面的屬性Attribute DescriptionRequired nametarget的名字Yes depends用逗號(hào)分隔的target的名字列表,也就是依賴表。 No if執(zhí)行target所需要設(shè)定的屬性名。 No unless執(zhí)行target需要清除設(shè)定的屬性名。 No description關(guān)于target功能的簡短描述。 No3.3Tasks一個(gè)task是一段可執(zhí)行的代碼。 一個(gè)task可以有多個(gè)屬性(如果你愿意的話,可以將其稱之為變量)。 屬性只可能包含對(duì)property的引用。 這些引用會(huì)在task執(zhí)行前被解析。 下面是Task的一般構(gòu)造形式這里name是task的名字,attributeN是屬性名,valueN是屬性值。 有一套內(nèi)置的(built-in)task,以及一些可選task,但你也可以編寫自己的task。 所有的task都有一個(gè)task名字屬性。 Ant用屬性值來產(chǎn)生日志信息。 可以給task賦一個(gè)id屬性這里taskname是task的名字,而taskID是這個(gè)task的唯一標(biāo)識(shí)符。 通過這個(gè)標(biāo)識(shí)符,你可以在腳本中引用相應(yīng)的task。 例如,在腳本中你可以這樣task1.setFoo(bar);設(shè)定某個(gè)task實(shí)例的foo屬性。 在另一個(gè)task中(用java編寫),你可以利用下面的語句存取相應(yīng)的實(shí)例。 project.getReference(task1).注意1如果task1還沒有運(yùn)行,就不會(huì)被生效(例如不設(shè)定屬性),如果你在隨后配置它,你所作的一切都會(huì)被覆蓋。 注意2未來的Ant版本可能不會(huì)兼容這里所提的屬性,因?yàn)楹苡锌赡芨緵]有task實(shí)例,只有proxies。 3.4Properties一個(gè)project可以有很多的properties。 可以在buildfile中用property task來設(shè)定,或在Ant之外設(shè)定。 一個(gè)property有一個(gè)名字和一個(gè)值。 property可用于task的屬性值。 這是通過將屬性名放在$和之間并放在屬性值的位置來實(shí)現(xiàn)的。 例如如果有一個(gè)property builddir的值是build,這個(gè)property就可用于屬性值$builddir/classes。 這個(gè)值就可被解析為build/classes。 內(nèi)置屬性如果你使用了task定義了所有的系統(tǒng)屬性,Ant允許你使用這些屬性。 例如,$對(duì)應(yīng)操作系統(tǒng)的名字。 要想得到系統(tǒng)屬性的列表可參考the Javadocof System.getProperties。 除了Java的系統(tǒng)屬性,Ant還定義了一些自己的內(nèi)置屬性basedir project基目錄的絕對(duì)路徑(與的basedir屬性一樣)。 ant.file buildfile的絕對(duì)路徑。 ant.version Ant的版本。 當(dāng)前執(zhí)行的project的名字;由的name屬性設(shè)定.ant.java.version Ant檢測(cè)到的JVM的版本;目前的值有1.1,1.2,1.3and1.4.例子3.5Path-like Structures你可以用:和;作為分隔符,指定類似PATH和CLASSPATH的引用。 Ant會(huì)把分隔符轉(zhuǎn)換為當(dāng)前系統(tǒng)所用的分隔符。 當(dāng)需要指定類似路徑的值時(shí),可以使用嵌套元素。 一般的形式是location屬性指定了相對(duì)于project基目錄的一個(gè)文件和目錄,而path屬性接受逗號(hào)或分號(hào)分隔的一個(gè)位置列表。 path屬性一般用作預(yù)定義的路徑其他情況下,應(yīng)該用多個(gè)location屬性。 為簡潔起見,classpath標(biāo)簽支持自己的path和location屬性。 所以可以被簡寫作也可通過元素指定路徑。 構(gòu)成一個(gè)fileset的多個(gè)文件加入path-like structure的順序是未定的。 上面的例子構(gòu)造了一個(gè)路徑值包括$classpath的路徑,跟著lib目錄下的所有jar文件,接著是classes目錄。 如果你想在多個(gè)task中使用相同的path-like structure,你可以用元素定義他們(與target同級(jí)),然后通過id屬性引用參考Referencs例子。 path-like structure可能包括對(duì)另一個(gè)path-like structurede的引用(通過嵌套元素)前面所提的關(guān)于的簡潔寫法對(duì)于也是有效的,如可寫成命令行變量有些task可接受參數(shù),并將其傳遞給另一個(gè)進(jìn)程。 為了能在變量中包含空格字符,可使用嵌套的arg元素。 Attribute DescriptionRequired value一個(gè)命令行變量;可包含空格字符。 只能用一個(gè)line空格分隔的命令行變量列表。 file作為命令行變量的文件名;會(huì)被文件的絕對(duì)名替代。 path一個(gè)作為單個(gè)命令行變量的path-like的字符串;或作為分隔符,Ant會(huì)將其轉(zhuǎn)變?yōu)樘囟ㄆ脚_(tái)的分隔符。 例子是一個(gè)含有空格的單個(gè)的命令行變量。 是兩個(gè)空格分隔的命令行變量。 是一個(gè)命令行變量,其值在DOS系統(tǒng)上為dir;dir2;dir3;在Unix系統(tǒng)上為/dir:/dir2:/dir3。 References buildfile元素的id屬性可用來引用這些元素。 如果你需要一遍遍的復(fù)制相同的XML代碼塊,這一屬性就很有用如多次使用結(jié)構(gòu)。 下面的例子可以寫成如下形式所有使用PatternSets,FileSets或path-like structures嵌套元素的task也接受這種類型的引用。 4.1File(Directory)類4.1.1Mkdir?創(chuàng)建一個(gè)目錄,如果他的父目錄不存在,也會(huì)被同時(shí)創(chuàng)建。 ?例子?說明如果build不存在,也會(huì)被同時(shí)創(chuàng)建4.1.2Copy?拷貝一個(gè)(組)文件、目錄?例子1.拷貝單個(gè)的文件2.拷貝單個(gè)的文件到指定目錄下3.拷貝一個(gè)目錄到另外一個(gè)目錄下4.拷貝一批文件到指定目錄下5.拷貝一批文件到指定目錄下,將文件名后增加。 Bak后綴6.拷貝一組文件到指定目錄下,替換其中的標(biāo)簽內(nèi)容4.1.3Delete?刪除一個(gè)(組)文件或者目錄?例子1.刪除一個(gè)文件2.刪除指定目錄及其子目錄3.刪除指定的一組文件4.刪除指定目錄及其子目錄,包括他自己4.1.4Move?移動(dòng)或重命名一個(gè)(組)文件、目錄?例子1.移動(dòng)或重命名一個(gè)文件2.移動(dòng)或重命名一個(gè)文件到另一個(gè)文件夾下面3.將一個(gè)目錄移到另外一個(gè)目錄下4.將一組文件移動(dòng)到另外的目錄下5.移動(dòng)文件過程中增加。 Bak后綴4.2Java相關(guān)4.2.1Javac?編譯java原代碼?例子1.編譯$src目錄及其子目錄下的所有。 Java文件,。 Class文件將放在$build指定的目錄下,classpath表示需要用到的類文件或者目錄,debug設(shè)置為on表示輸出debug信息2.編譯$src和$src2目錄及其子目錄下的所有。 Java文件,但是package/p1/*,mypackage/p2/*將被編譯,而mypackage/p1/testpackage/*將不會(huì)被編譯。 Class文件將放在$build指定的目錄下,classpath表示需要用到的類文件或者目錄,debug設(shè)置為on表示輸出debug信息3.路徑是在property中定義的4.2.2java?執(zhí)行指定的java類?例子1.classname中指定要執(zhí)行的類,classpath設(shè)定要使用的環(huán)境變量2.4.3打包相關(guān)4.3.1jar?將一組文件打包?例子1.將$build/classes下面的所有文件打包到$dist/lib/app.jar中2.將$build/classes下面的所有文件打包到$dist/lib/app.jar中,但是包括mypackage/test所有文件不包括所有的Test.class3.manifest屬性指定自己的META-INF/MANIFEST.MF文件,而不是由系統(tǒng)生成4.3.2war?對(duì)Jar的擴(kuò)展,用于打包Web應(yīng)用?例子?假設(shè)我們的文件目錄如下thirdparty/libs/jdbc1.jar thirdparty/libs/jdbc2.jar build/main/myco/myapp/Servlet.class src/metadata/myapp.xml src/html/myapp/index.html src/jsp/myapp/front.jsp src/graphics/images/gifs/small/logo.gif src/graphics/images/gifs/large/logo.gif?下面是我們的任務(wù)的內(nèi)容?完成后的結(jié)果WEB-INF/web.xml WEB-INF/lib/jdbc2.jar WEB-INF/classes/myco/myapp/Servlet.class META-INF/MANIFEST.MF index.html front.jsp images/small/logo.gif images/large/logo.gif4.3.3ear?用于打包企業(yè)應(yīng)用?例子4.4時(shí)間戳在生成環(huán)境中使用當(dāng)前時(shí)間和日期,以某種方式標(biāo)記某個(gè)生成任務(wù)的輸出,以便記錄它是何時(shí)生成的,這經(jīng)常是可取的。 這可能涉及一個(gè)文件,以便插入一個(gè)字符串來指定日期和時(shí)間,或?qū)⑦@個(gè)信息合并到JAR或zip文件的文件名中。 這種需要是通過簡單但是非常有用的tstamp任務(wù)來解決的。 這個(gè)任務(wù)通常在某次生成過程開始時(shí)調(diào)用,比如在一個(gè)init目標(biāo)中。 這個(gè)任務(wù)不需要屬性,許多情況下只需就足夠了。 tstamp不產(chǎn)生任何輸出;相反,它根據(jù)當(dāng)前系統(tǒng)時(shí)間和日期設(shè)置Ant屬性。 下面是tstamp設(shè)置的一些屬性、對(duì)每個(gè)屬性的說明,以及這些屬性可被設(shè)置到的值的例子屬性說明例子DSTAMP設(shè)置為當(dāng)前日期,默認(rèn)格式為yyyymmddxx1217TSTAMP設(shè)置為當(dāng)前時(shí)間,默認(rèn)格式為hhmm1603TODAY設(shè)置為當(dāng)前日期,帶完整的月份xx年12月17日例如,在前一小節(jié)中,我們按如下方式創(chuàng)建了一個(gè)JAR文件在調(diào)用tstamp任務(wù)之后,我們能夠根據(jù)日期命名該JAR文件,如下所示因此,如果這個(gè)任務(wù)在xx年12月17日調(diào)用,該JAR文件將被命名為package-xx1217.jar。 還可以配置tstamp任務(wù)來設(shè)置不同的屬性,應(yīng)用一個(gè)當(dāng)前時(shí)間之前或之后的時(shí)間偏移,或以不同的方式格式化該字符串。 所有這些都是使用一個(gè)嵌套的format元素來完成的,如下所示上面的清單將OFFSET_TIME屬性設(shè)置為距離當(dāng)前時(shí)間10分鐘之后的小時(shí)數(shù)、分鐘數(shù)和秒數(shù)。 用于定義格式字符串的字符與java.text.SimpleDateFormat類所定義的那些格式字符相同4.5執(zhí)行SQL語句?通過jdbc執(zhí)行SQL語句?例子1.2.只有在oracle、版本是8.1的時(shí)候才執(zhí)行4.6發(fā)送郵件?使用SMTP服務(wù)器發(fā)送郵件?例子The$buildnamenightly buildhas pleted?mailhost SMTP服務(wù)器地址?mailport服務(wù)器端口?subject主題?from發(fā)送人地址?to接受人地址?message發(fā)送的消息?fileset設(shè)置附件=在ANT出現(xiàn)之前,編譯和部署Java應(yīng)用需要使用包括特定平臺(tái)的腳本、Make文件、不同的IDE以及手工操作等組成的大雜燴。 現(xiàn)在,幾乎所有的開源Java項(xiàng)目都在使用Ant,許多公司的開發(fā)項(xiàng)目也在使用Ant。 Ant的大量使用,也自然帶來了對(duì)總結(jié)Ant最佳實(shí)踐的迫切需求。 本文總結(jié)了我喜好的Ant最佳實(shí)踐,很多是從親身經(jīng)歷的項(xiàng)目錯(cuò)誤,或從其他開發(fā)者的“恐怖”故事中得到的靈感的。 比如,有人告訴我有個(gè)項(xiàng)目將XDoclet生成的代碼放入鎖定文件的版本控制工具中。 單開發(fā)者修改源代碼時(shí),他必須記住手工檢出(Check out)并鎖定所有將要重生成的文件。 然后,手工運(yùn)行代碼生成器,當(dāng)他能夠讓Ant編譯代碼時(shí),這一方法還存在一些問題生成的代碼無法存儲(chǔ)在版本控制系統(tǒng)中Ant(本案例中是Xdoclet)應(yīng)該自動(dòng)確定下一次構(gòu)建涉及的源文件,而不應(yīng)由程序員人工確定。 Ant的構(gòu)建文件應(yīng)該定義好正確的任務(wù)依賴關(guān)系,這樣程序員不必按照特定順序調(diào)用任務(wù)。 當(dāng)我開始一個(gè)新項(xiàng)目時(shí),我首先編寫Ant構(gòu)建文件。 文件定義構(gòu)建的過程,并為團(tuán)隊(duì)中的每個(gè)程序員都使用。 本文所有的最佳實(shí)踐假設(shè)Ant構(gòu)建文件是一個(gè)必須精心編寫的重要文件,它應(yīng)在版本控制系統(tǒng)中得到維護(hù),并定期進(jìn)行重構(gòu)。 下面是我的十五大Ant最佳實(shí)踐。 1.采用一致的編碼規(guī)范Ant用戶不管是喜歡還是痛恨XML構(gòu)建文件的語法,都愿意跳進(jìn)這一迷人的爭論中。 讓我們先看一些保持XML構(gòu)建文件簡潔的方法。 首先,也是最重要的,化費(fèi)時(shí)間格式化你的XML讓它看上去很清晰。 不過XML是否美觀,Ant都可以工作。 但是丑陋的XML很難讀懂。 倘若你在任務(wù)之間留出空行,有規(guī)則的縮進(jìn),每行文字不超過90列,那么XML令人驚訝的易讀。 再加上好的器或IDE高亮相應(yīng)的語句,你就不會(huì)有如何閱讀的麻煩。 同樣,精選有意義明確、容易讀懂的詞匯來命名任務(wù)和屬性。 比如,dir.reports就比rpts好。 并不需要特定的編碼規(guī)范,只要有一種規(guī)范并堅(jiān)持使用就好。 2.將build.xml放在項(xiàng)目根目錄中Ant構(gòu)建文件build.xml可以放在如何位置,但是放在項(xiàng)目頂層目錄中可以保持項(xiàng)目簡潔。 這是最普遍的規(guī)范,使開發(fā)者能夠在根目錄找到它。 同時(shí),也能夠容易了解項(xiàng)目中不同目錄之間的邏輯關(guān)系。 以下是一個(gè)典型的項(xiàng)目層次root dir|build.xml+-src+-lib(包含第三方JAR包)+-build(由build任務(wù)生成)+-dist(由build任務(wù)生成)當(dāng)build.xml在頂級(jí)目錄時(shí),倘若你在項(xiàng)目某個(gè)子目錄中,只要輸入ant-find pile命令,不需要改變工作目錄就能夠以命令行方式編譯代碼。 參數(shù)-find告訴Ant尋找存在于上級(jí)目錄中的build.xml并執(zhí)行。 3.使用單一構(gòu)建文件有人喜歡將一個(gè)大項(xiàng)目分解到幾個(gè)小的構(gòu)建文件,每個(gè)構(gòu)建文件分擔(dān)整個(gè)構(gòu)建過程的一小部分工作。 但是應(yīng)該認(rèn)識(shí)到,將構(gòu)建文件分割會(huì)增加對(duì)整個(gè)構(gòu)建過程的理解難度。 要注意在單一構(gòu)建文件能夠清楚表現(xiàn)構(gòu)建層次的情況下,不要過工程化(over-engineer)。 即使你把項(xiàng)目劃分為多個(gè)構(gòu)建文件,也應(yīng)使程序員能夠在項(xiàng)目根目錄下找到核心build.xml。 盡管該文件只是將實(shí)際構(gòu)建工作委派給下級(jí)構(gòu)建文件,也應(yīng)保證該文件可用。 4.提供良好的幫助說明應(yīng)盡量使構(gòu)建文件自文檔化。 增加任務(wù)描述是最簡單的方法。 當(dāng)你輸入ant-projecthelp時(shí),你就可以看到帶有描述的任務(wù)清單。 比如,你可以這樣定義任務(wù)最簡單的規(guī)則是對(duì)所有你希望程序員通過命令行直接調(diào)用的任務(wù)都加上描述。 對(duì)于一般用來執(zhí)行中間處理過程的內(nèi)部任務(wù),比如生成代碼或建立輸出目錄等,就無法使用描述屬性。 這時(shí),可以通過在構(gòu)建文件中加入XML注釋來處理。 或者專門定義一個(gè)help任務(wù),當(dāng)程序員輸入ant help時(shí)來顯示詳細(xì)的使用說明。 Detailed help.5.提供清空任務(wù)每個(gè)構(gòu)建文件都應(yīng)包含一個(gè)清空任務(wù),刪除所有生成的文件和目錄,使系統(tǒng)回到構(gòu)建文件執(zhí)行前的初始狀態(tài)。 執(zhí)行清空任務(wù)后還存在的文件應(yīng)處在版本控制系統(tǒng)的管理下。 比如除非是在產(chǎn)生整個(gè)系統(tǒng)版本的特殊任務(wù)中,否則不要自動(dòng)調(diào)用clean任務(wù)。 當(dāng)程序員僅僅執(zhí)行編譯任務(wù)或其他任務(wù)時(shí),他們不需要構(gòu)建文件事先執(zhí)行即令人討厭有沒有必要的清空任務(wù)。 要相信程序員能夠確定何時(shí)需要清空所有文件。 6.使用ANT管理任務(wù)從屬關(guān)系假設(shè)你的應(yīng)用由Swing GUI組件、Web界面、EJB層和公共應(yīng)用代碼組成。 在大型系統(tǒng)中,你需要清晰地定義Java包屬于系統(tǒng)的哪一層。 否則如何一點(diǎn)修改都要重新編譯成千上百個(gè)文件。 任務(wù)從屬關(guān)系管理差會(huì)導(dǎo)致過度復(fù)雜而脆弱的系統(tǒng)。 改變GUI面板的設(shè)計(jì)不應(yīng)造成Servlet和EJB的重編譯。 當(dāng)系統(tǒng)變得龐大后,稍不注意就可能將依賴于客戶端的代碼引入到服務(wù)端。 這是因?yàn)镮DE在編譯文件時(shí)使用單一的classpath。 Ant讓你更有效地控制構(gòu)建活動(dòng)。 設(shè)計(jì)你的構(gòu)建文件編譯大型項(xiàng)目的步驟首先,編譯公共應(yīng)用代碼,將編譯結(jié)果打成JAR包文件。 然后,編譯上一層的項(xiàng)目代碼,編譯時(shí)依靠第一步產(chǎn)生的JAR文件。 不斷重復(fù)這一過程,直到最高層的代碼編譯完成。 分步構(gòu)建強(qiáng)化了任務(wù)從屬關(guān)系管理。 如果你工作在底層Java框架上,引用高層的GUI模板組件,這時(shí)代碼不需要編譯。 這是由于構(gòu)建文件在編譯底層框架時(shí),在源路徑中沒有包含高層GUI面板組件的代碼。 7.定義并重用文件路徑如果文件路徑在一個(gè)地方集中定義,并在整個(gè)構(gòu)建文件中得到重用,那么構(gòu)建文件更易于理解。 以下是這樣做的一個(gè)例子.etc當(dāng)項(xiàng)目不斷增長,構(gòu)建日益復(fù)雜時(shí),這一技術(shù)越發(fā)體現(xiàn)出其價(jià)值。 你可能為編譯不同層次的應(yīng)用定義各自的文件路徑,比如運(yùn)行單元測(cè)試的、運(yùn)行應(yīng)用程序的、運(yùn)行Xdoclet的、生成JavaDocs的等等不同路徑。 這種組件化路徑定義的方法比為每個(gè)任務(wù)單獨(dú)定義路徑要優(yōu)越得多。 否則,很容易丟失任務(wù)任務(wù)從屬關(guān)系的軌跡。 8.定義恰當(dāng)?shù)娜蝿?wù)參數(shù)關(guān)系假設(shè)dist任務(wù)從屬于jar任務(wù),那么哪個(gè)任務(wù)從屬于pile任務(wù),哪個(gè)任務(wù)從屬于prepare任務(wù)呢?Ant構(gòu)建文件最終定義了任務(wù)的從屬關(guān)系圖,它必須被仔細(xì)地定義和維護(hù)。 應(yīng)該定期檢查任務(wù)的從屬關(guān)系以保證構(gòu)建工作得到正確執(zhí)行。 大的構(gòu)建文件隨著時(shí)間推移趨向于增加更多的任務(wù),所以到最后由于不必要的從屬關(guān)系導(dǎo)致構(gòu)建工作非常困難。 比如,你可能發(fā)現(xiàn)在程序員只是需要編譯一些沒有使用EJB的GUI代碼時(shí),重新生成EJB代碼。 以“優(yōu)化”的名義忽略任務(wù)的從屬關(guān)系是另一種常見的錯(cuò)誤。 這種錯(cuò)誤迫使程序員為了得到恰當(dāng)?shù)慕Y(jié)果必須記住并按照特定的順序調(diào)用一串任務(wù)。 更好的做法是提供描述清晰的公共任務(wù),這些任務(wù)包含正確的任務(wù)從屬關(guān)系;另外提供一套“專家”任務(wù)讓你能夠手工執(zhí)行個(gè)別的構(gòu)建步驟,這些任務(wù)不提供完整的構(gòu)建過程,但是讓那些專家在快速而惱人的編碼期間跳過某些步驟9.使用配置屬性任何需要配置或可能發(fā)生變化的信息都應(yīng)作為Ant屬性定義下來。 對(duì)于在構(gòu)建文件中多次出現(xiàn)的值也同樣處理。 屬性既可以在構(gòu)建文件頭部定義,也可以為了更好的靈活性而在單獨(dú)的屬性文件中定義。 以下是在構(gòu)建文件中定義屬性的樣式etc.或者你可以使用屬性文件etc.在屬性文件perties中:dir.build=builddir.src=srcjdom.home=./java-tools/jdom-b8jdom.jar=jdom.jarjdom.jar.withpath=$jdom.home/build/$jdom.jar用一個(gè)獨(dú)立的文件定義屬性是有好處的,它可以清晰地定義構(gòu)建中的可配置部分。 另外,在開發(fā)者工作在不同操作系統(tǒng)的情況下,你可以在不同的平臺(tái)上提供該文件的不同版本。 10.保持構(gòu)建過程獨(dú)立為了最大限度的擴(kuò)展性,不要應(yīng)用外部路徑和庫文件。 最重要的是不要依賴于程序員的CLASSPATH設(shè)置。 取而代之的是,在構(gòu)建文件中使用相對(duì)路徑并定義自己的路徑。 如果你引用了絕對(duì)路徑如C:javatools,其他開發(fā)者未必使用與你相同的目錄結(jié)構(gòu),所以就無法使用你的構(gòu)建文件如果你部署開發(fā)源碼項(xiàng)目,應(yīng)該提供包括所有需要的JAR文件的發(fā)行版本,當(dāng)然是在遵守許可協(xié)議的基礎(chǔ)上。 對(duì)于內(nèi)部項(xiàng)目,相關(guān)的JAR文件都應(yīng)在版本控制系統(tǒng)的管理中,并撿出到大家都知道的位置。 當(dāng)你不得不應(yīng)用外部路徑時(shí),應(yīng)將路徑定義為屬性。 使程序員能夠涌適合他們自己的機(jī)器的參數(shù)重載這些屬性。 你也可以使用以下語法引用環(huán)境變量11.使用版本控制系統(tǒng)構(gòu)建文件是一個(gè)重要的文件,應(yīng)該象代碼一樣進(jìn)行版本控制。 當(dāng)你標(biāo)記你的代碼時(shí),也應(yīng)用同樣的標(biāo)簽標(biāo)記構(gòu)建文件。 這樣當(dāng)你需要回溯構(gòu)建舊版本的軟件時(shí),能夠使用相對(duì)應(yīng)的舊版本構(gòu)建文件。 除構(gòu)建文件之外,你還應(yīng)在版本控制中維護(hù)第三方JAR文件。 同樣,這使你能夠重新構(gòu)建舊版本的軟件。 這也能夠更容易保證所有開發(fā)者擁有一致的JAR文件,因?yàn)樗麄兌际峭瑯?gòu)建文件一起從版本控制系統(tǒng)中撿出的。 通常應(yīng)避免在版本控制系統(tǒng)中存放構(gòu)建輸出品。 倘若你的源代碼很好地得到了版本控制,那么通過構(gòu)建過程你能夠重新生成任何版本的產(chǎn)品。 12.把Ant作為“最小公分母”假設(shè)你的開發(fā)團(tuán)隊(duì)使用IDE,為什么要為程序員通過點(diǎn)擊圖標(biāo)就能夠構(gòu)建整個(gè)應(yīng)用而煩惱呢?IDE的問題在團(tuán)隊(duì)中是一個(gè)關(guān)于一致性和重現(xiàn)性的問題。 幾乎所有的IDE設(shè)計(jì)初衷都是為了提高程序員的個(gè)人生產(chǎn)率,而不是開發(fā)團(tuán)隊(duì)的持續(xù)構(gòu)建。 典型的IDE要求每個(gè)程序員定義自己的項(xiàng)目文件。 程序員可能擁有不同的目錄結(jié)構(gòu),可能使用不同版本的庫文件,還可能工作在不同的平臺(tái)上。 這將導(dǎo)致出現(xiàn)這種情況在A那里運(yùn)行良好的代碼,到B那里就無法運(yùn)行。 不管你的開發(fā)團(tuán)隊(duì)使用何種IDE,一定要建立所有程序員都能夠使用的Ant構(gòu)建文件。 要建立一個(gè)程序員在將新代碼提交版本控制系統(tǒng)前必須執(zhí)行Ant構(gòu)建文件的規(guī)則。 這將確保代碼是經(jīng)過同一個(gè)Ant構(gòu)建文件構(gòu)建的。 當(dāng)出現(xiàn)問題時(shí),要使用項(xiàng)目標(biāo)準(zhǔn)的Ant構(gòu)建文件,而不是通過某個(gè)IDE來執(zhí)行一個(gè)干凈的構(gòu)建。 程序員可以自由選擇任何他們習(xí)慣使用的IDE。 但是A

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論