ant是什么?
用ant來(lái)管理項(xiàng)目
內(nèi)容:
-. Ant簡(jiǎn)介
二.Ant的安裝及配置
三:用ant管理項(xiàng)目
四:小技巧
本文描述了ant的基本語(yǔ)法及其如何應(yīng)用于項(xiàng)目的管理
-. Ant簡(jiǎn)介
可能有許多讀者并不了解什么是ant,以及如何使用它。但只要你是用過(guò)linux,你應(yīng)該知道m(xù)ake為何物,當(dāng)我們編譯linux內(nèi)核及一些軟件的源程序時(shí),我們經(jīng)常需要在控制臺(tái)下輸入make。Make其實(shí)就是一個(gè)項(xiàng)目管理工具,而ant所實(shí)現(xiàn)的功能與make差不多。Ant是apache軟件基金會(huì)jakarta項(xiàng)目中的一個(gè)子項(xiàng)目,由于是基于java編寫的,因此具有很好的跨平臺(tái)性。Ant由一些內(nèi)置任務(wù)(task)和可選擇的任務(wù)組成(當(dāng)然你還可以編寫自己的任務(wù)),使用Make時(shí),你需要寫一個(gè)Makefile文件,而用ant時(shí)則需要寫一個(gè)build.xml文件。由于采用xml的語(yǔ)法,所以build.xml文件很容易書寫和維護(hù),且結(jié)構(gòu)很清晰,而不像Makefile文件有那么多的限制(例如在tab符號(hào)前有一個(gè)空格的話,命令就不會(huì)執(zhí)行)。Ant的優(yōu)點(diǎn)遠(yuǎn)不止這些,它還很容易的集成到一些開發(fā)環(huán)境中(例如visual age,jbuilder,netbeans)。
二.Ant的安裝及配置
安裝
Ant目前的版本是1.3,首先到http://jakarta.apache.org/ant/index.html下載ant最新版本1.3,解壓到C:/ant(window操作系統(tǒng)) 或者/usr/local/ant(linux操作系統(tǒng)),由于我們要用到xmlc ,而ant1.3中并沒(méi)有包含它,所以我們需要David.Li為ant寫的xmlc任務(wù)。具體url為http://www.digitalsesame.com/enhydra/EnhydraAnt20001213.tar.gz。將下載后的文件中的ant.jar替換掉ant1.3中ant.jar.這樣ant的版本變?yōu)?.2.
2.設(shè)置路徑
(1):windows98操作系統(tǒng)
編輯C:\enhydra\.bashrc,加入下面三行
export ANT_HOME=/ant
export JAVA_HOME=/jdk-1.2.2
export PATH=${PATH}:${ANT_HOME}/bin
(2):Linux操作系統(tǒng)
編輯/etc/profile或者 用戶目錄下的.bashrc文件,加入下面三行
export ANT_HOME=/usr/local/ant
export JAVA_HOME=/usr/local/jdk-1.2.2
export PATH=${PATH}:${ANT_HOME}/bin
三:用ant管理項(xiàng)目
1:基本的文件目錄結(jié)構(gòu) 解壓到任意目錄,我們可以看到目錄樹結(jié)構(gòu)如下
├─bin
├─docs
│ ├─ant2
│ ├─api
│ │ └─org
│ │ └─apache
│ │ └─tools
│ │ ├─ant
│ │ │ ├─taskdefs
│ │ │ │ ├─compilers
│ │ │ │ └─optional
│ │ │ │ ├─clearcase
│ │ │ │ ├─depend
│ │ │ │ │ └─constantpool
│ │ │ │ ├─dotnet
│ │ │ │ ├─ejb
│ │ │ │ ├─ide
│ │ │ │ ├─javacc
│ │ │ │ ├─jlink
│ │ │ │ ├─jsp
│ │ │ │ ├─junit
│ │ │ │ ├─metamata
│ │ │ │ ├─net
│ │ │ │ ├─perforce
│ │ │ │ ├─scm
│ │ │ │ ├─sound
│ │ │ │ └─vss
│ │ │ ├─types
│ │ │ └─util
│ │ │ └─regexp
│ │ ├─mail
│ │ └─tar
│ └─manual
│ ├─CoreTasks
│ ├─CoreTypes
│ ├─Integration
│ └─OptionalTasks
└─lib
在這個(gè)目錄樹結(jié)構(gòu)中,與傳統(tǒng)的項(xiàng)目不同的是,我們用build.xml取代了Makefile,在講述這個(gè)build.xml文件前,我們先了解一個(gè)基本的 build.xml文件的結(jié)構(gòu)。
2:build.xml的基本書寫規(guī)范
下面我們就來(lái)講述這個(gè)文件的書寫方法,下面是這個(gè)文件的全部?jī)?nèi)容
1.<?xml version="1.0"?>
2.<project name="MyProject" default="dist" basedir=".">
3.<property name="dist" value="dist"/>
4.<target name="init">
5.<mkdir dir="${dist}"/>
6.</target>
7.</project>
為了方便說(shuō)明,我們?yōu)槊恳恍屑恿诵刑?hào),第一行是xml文件的基本要素,第二行說(shuō)明這是一個(gè)項(xiàng)目,第七行說(shuō)明項(xiàng)目的結(jié)束 ,在第二行中,name="MyProject"說(shuō)明此項(xiàng)目的名稱,這個(gè)屬性可有可無(wú)。basedir="."說(shuō)明基本目錄,此屬性可有可無(wú)。default="dist"說(shuō)明項(xiàng)目的缺省目標(biāo)(target)是什么,這個(gè)屬性必須有。所謂目標(biāo)(target)就是一系列任務(wù)(task)組成的一個(gè)集合。每個(gè)任務(wù)(task)的書寫方法如下:
<任務(wù)名 屬性1="屬性1的值" 屬性2="屬性2的值" ....... />
第三行定義了一些屬性(property),以便后面使用,這非常類似于編程中定義的全局變量。從第四行開始定義目標(biāo)(target),name="init"指明了此目標(biāo)的名稱,name屬性在定義目標(biāo)時(shí)必須有,當(dāng)然定義目標(biāo)時(shí)還有其他一些屬性可選,例如depends,unless,具體請(qǐng)參考ant的文檔。第五行開始定義此目標(biāo)內(nèi)的任務(wù),其中mkdir時(shí)ant的內(nèi)部任務(wù)名,dir是此任務(wù)的屬性,其值為${dist}。此任務(wù)就是創(chuàng)建一個(gè)目錄。其中${dist}是獲取dist屬性的值(就是我們?cè)诘谌卸x的)。如上就是一個(gè)基本的build.xml文件的寫法。你可以在命令行上輸入 ant -buildfile build.xml
看一下你的當(dāng)前目錄下是否多了一個(gè)dist目錄。如果出錯(cuò),則可能是你沒(méi)有把a(bǔ)nt配置好,參見前面講的安裝及配置,看一下哪兒出了錯(cuò)。
3:build.xml文件
build.xml文件如下,其中有的注釋和無(wú)關(guān)的代碼刪掉了,且做了一下小小的改動(dòng)
1:<?xml version="1.0"?>
2: <project default="app" basedir=".">
3:<!-- 加入 xmlc 任務(wù)-->
4:<taskdef name="xmlc"classname="org.apache.tools.ant.taskdefs.optional.enhydra.Xmlc"/>
5:<!-- =================================================================== -->
6:<!-- 設(shè)置編譯的類路徑 -->
7:<!-- =================================================================== -->
8:<path id="build.classpath">
9:<pathelement path="${build.classes}"/>
10:</path>
11:<!-- =================================================================== -->
12:<!-- 初始化基本屬性 -->
13:<!-- =================================================================== -->
14:<target name="init">
15:<!-- Set up application info -->
16:<property name="app.Name" value="AntDemo"/>
17:<property name="app.name" value="antDemo"/>
18:<property name="app.version" value="0.0.1"/>
19:<property name="app.year" value="2000"/>
20:<!-- source code and document info -->
21:<property name="src.dir" value="."/>
22:<property name="doc.dir" value="./doc"/>
23:<property name="lib.dir" value="./lib"/>
24:<!-- package to be javadocs -->
25:<property name="packages" value="antDemo.*"/>
26:<!-- build info -->
27:<property name="build.dir" value="ant.build"/>
28:<property name="build.classes" value="${build.dir}/classes"/>
29:<property name="build.lib" value="${build.dir}/lib"/>
30:<property name="build.javadocs" value="${build.dir}/javadocs"/>
31:<property name="build.xmlc.dir" value="${build.dir}/xmlcout/"/>
32:<property name="build.debug" value="on"/>
33:<property name="dist.dir" value="./${app.name}-${app.version}"/>
34: </target>
35:<!-- =================================================================== -->
36:<!-- 創(chuàng)建要存放編譯厚的文件的目錄 -->
37:<!-- =================================================================== -->
38:<target name="prepare" depends="init">
39:<mkdir dir="${build.dir}"/>
40:</target>
41:<!-- =================================================================== -->
42:<!-- 用XMLC工具編譯 html文件-->
43:<!-- =================================================================== -->
44:<target name="xmlc" depends="prepare">
45:<mkdir dir="${build.xmlc.dir}"/>
46:<xmlc srcdir="${src.dir}"
47:sourceout="${build.xmlc.dir}"
48:includes="**/*.html">
49:<!-- element name is same as command line parameter -->
50:<warnings param1="false"/>
51:<generate param1="both"/>
52:<html_encoding param1="gb2312"/>
53:<!-- the old arg element is still supported -->
54:<arg name="ssi"/>
55:<arg name="keep"/>
56:<!-- prefixmap do package name mapping -->
57:<prefixmap old="antDemo.presentation.html" new="antDemo.presentation"/>
58:</xmlc>
59:</target>
60:<!-- =================================================================== -->
61:<!-- 編譯 -->
62:<!-- =================================================================== -->
63:<target name="compile" depends="xmlc,prepare">
64:<mkdir dir="${build.classes}"/>
65:<!-- compile XMLC generated java -->
66:<javac srcdir="${build.xmlc.dir}"
67:destdir="${build.classes}"
68:classpathref="build.classpath"
69:debug="${build.debug}"/>
70:<!-- compile java codes -->
71:<javac srcdir="${src.dir}"
72:destdir="${build.classes}"
73:classpathref="build.classpath"
74:debug="${build.debug}"
75:includes="${app.name}/**"
76:/>
77:</target>
78:<!-- =================================================================== -->
79:<!-- 復(fù)制 -->
80:<!-- =================================================================== -->
81:<target name="extra" depends="init">
82:<mkdir dir="${build.classes}/${app.name}/presentation"/>
83:<copy todir="${build.classes}/${app.name}/presentation">
84:<fileset dir="${src.dir}/${app.name}/presentation">
85:<include name="**/*.gif"/>
86:<include name="**/*.jpg"/>
87:<include name="**/*.js"/>
88:<include name="**/*.css"/>
89:</fileset>
90:</copy>
91:</target>
92:<!-- =================================================================== -->
93:<!-- 創(chuàng)建lib目錄,class文件及其他文件打包 -->
94:<!-- =================================================================== -->
95:<target name="jar" depends="extra,compile">
96:<mkdir dir="${build.lib}"/>
97:<jar jarfile="${build.lib}/${app.name}.jar" basedir="${build.classes}" />
98:</target>
99:<!-- =================================================================== -->
100:<!-- 復(fù)制應(yīng)用程序的配置文件 -->
101:<!-- =================================================================== -->
102:<target name="app" depends="jar,extra">
103:<!-- do the app.conf -->
104:<copy file="${src.dir}/${app.name}/${app.Name}.conf" todir="${build.dir}"/>
105:<!-- do the multiserver.conf -->
106:<filter token="OUTPUT" value="./" />
107:<copy file="${src.dir}/${app.name}/multiserver.conf.in"
108:tofile="${build.dir}/multiserver.conf"
109:filtering="on"/>
110:<!-- do the start script -->
111:<copy file="${src.dir}/${app.name}/start" todir="${build.dir}"/>
112:<chmod file="${build.dir}/start" perm="ugo+rx"/>
113:</target>
114:</project>
4:build.xml詳細(xì)說(shuō)明
下面我們將詳細(xì)講述這個(gè)文件,同樣為了方便,我加了行號(hào),當(dāng)然一些基本的東西我就不再重復(fù)了。第四行taskdef任務(wù)(task)屬于ant的內(nèi)部任務(wù),它的作用是定義一個(gè)任務(wù),其基本屬性有name,classname,在定義時(shí)這兩個(gè)屬性都必需有。第八行開始定義一個(gè)path,它有一個(gè)屬性id,通過(guò)這個(gè)id的值我們可以在后面引用這個(gè)path,參見第68行。目標(biāo)(target)init(從14行到34行)定義了一些基本屬性(property),主要是為了后面的target使用。在第38行,你會(huì)看到depends="init",depends是定義一個(gè)目標(biāo)時(shí)的可選屬性,它的意思是如果init目標(biāo)沒(méi)有執(zhí)行(出錯(cuò)或其他原因),這個(gè)目標(biāo)也不會(huì)被執(zhí)行。
從第46行開始定義xmlc任務(wù),到第58行結(jié)束,中間有很多參數(shù)嵌套在其中,srcdir指定源文件目錄,sourceout指定輸出目錄,includes屬性將源文件目錄中的所有html文件包括進(jìn)來(lái)。*為通配符。
<warnings param1="false"/>表示取消警告,<generate param1="both"/>表示同時(shí)產(chǎn)生接口和實(shí)現(xiàn)代碼,例如:一個(gè)welcome.html,它會(huì)產(chǎn)生兩個(gè)文件:WelcomeHTMLImpl.java,WelcomeHTML.java,WelcomeHTML.java中只定義了一個(gè)接口WelcomeHTML,真正的實(shí)現(xiàn)在WelcomeHTMLImpl.java中。<html_encoding param1="gb2312"/>表示設(shè)置編碼,由于xmlc將html文件編譯為java類,即使你在html文件中已經(jīng)設(shè)置了編碼,在java類中也不會(huì)有作用,必須在編譯時(shí)設(shè)置編碼。<arg name="ssi"/> <arg name="keep"/>這兩句相當(dāng)于在命令行上輸入-ssi -keep.其中ssi參數(shù)是在編譯html文件時(shí)將定義的ssi文件包括進(jìn)來(lái),見html目錄下的welcome2.html源代碼中有一行:<!--#include file="welcome.ssi"-->。keep參數(shù)會(huì)保留編譯html文件后產(chǎn)生的java文件。第57行意思是將包更名,由于html文件在antDemo/presentation/html目錄下,因此產(chǎn)生的java類屬于antDemo.presentation.html包,我們通過(guò)new屬性的值將屬于此包的類改為屬于新的包,使用xmlc時(shí),一般以上幾個(gè)參數(shù)就足夠了,要想使用更多的參數(shù),請(qǐng)參見xmlc task定義的源代碼 。
從第63行到77行,目標(biāo)(target)定義了編譯時(shí)的細(xì)節(jié),編譯分為兩部分,分別編譯xmlc產(chǎn)生的java類和項(xiàng)目中的java類(表現(xiàn)層,商務(wù)層,數(shù)據(jù)層中的代碼)。javac這個(gè)任務(wù)中,srcdir屬性指定java文件存放位置,destdir屬性指定編譯后的class文件存放位置,classpathref屬性指定classpath,debug屬性設(shè)置關(guān)閉還是打開調(diào)試信息,includes屬性起一個(gè)過(guò)濾作用,它指定編譯那些文件,否則javac將會(huì)編譯srcdir屬性指定的目錄下的所有java文件。
81行到91行開始將將程序中用到的其他文件也復(fù)制到目標(biāo)目錄,以便下一步打包。在copy任務(wù)中,todir屬性指定目標(biāo)目錄,至于復(fù)制那些文件,則由嵌套在copy任務(wù)中的fileset任務(wù)來(lái)指定。在fileset中,dir指定基本目錄,include和exclude屬性用來(lái)過(guò)濾文件,符合條件的文件將會(huì)被復(fù)制到目標(biāo)目錄。
95行到98行開始將程序打包,jarfile屬性指定打包后的文件名,basedir指定基本目錄,基本目錄下的文件及子目錄都會(huì)按照其本來(lái)的組織結(jié)構(gòu)放到j(luò)ar文件中。
102行到113行,開始復(fù)制配置文件,配置文件包括AntDemo.conf,multiserver.conf,start.其中第112行,chmod任務(wù)將start文件的屬性改為對(duì)任何人可執(zhí)行和可讀。
通過(guò)上面的講解,你可能看出使用ant的優(yōu)越性,ant可以方便的管理一個(gè)大型的項(xiàng)目,當(dāng)然其他的項(xiàng)目也可以,重要的是,你可以很容易的對(duì)它的task進(jìn)行擴(kuò)充。相信越來(lái)越多的人會(huì)使用ant來(lái)進(jìn)行項(xiàng)目的管理。
四:小技巧:
由于使用ant時(shí)可能出錯(cuò),而屏幕不夠大的話,可能看不清,最好將編譯出錯(cuò)信息放入一個(gè)文件中,如下這樣使用ant:
ant -buildfile build.xml -logfile error.log
就會(huì)將出錯(cuò)信息放入error.log中,由于使用buildfile參數(shù),因此xml文件名不一定時(shí)build.xml,可以為任意xml 文件,如project.xml
ant使用簡(jiǎn)介
ant 是apache 工程的一個(gè)子工程,是一個(gè)基于java的build工具。ant類似于make工具,但沒(méi)有傳統(tǒng)的make工具的缺點(diǎn)。傳統(tǒng)的make往往只能限制在某一平臺(tái)上使用,ant本身用java類實(shí)現(xiàn),要構(gòu)建的工程的配置文件用xml格式描述,可以很方便實(shí)現(xiàn)多平臺(tái)編譯,非常適合build大型工程。
1.安裝配置ant:
ant 可以從http://ant.apache.org下載,目前最新版本為1.5.2。下載完畢后直接解壓縮,目錄如下:
ant
+-- bin // contains launcher scripts
|
+-- lib // contains Ant jars plus necessary dependencies
|
+-- docs // contains documentation
| +-- ant2 // a brief description of ant2 requirements
| |
| +-- images // various logos for html documentation
| |
| +-- manual // Ant documentation (a must read )
|
+-- etc
需要設(shè)置的環(huán)境變量:
ANT_HOME:ant的安裝目錄
JAVA_HOME:jdk的安裝目錄
PATH:把%ANT_HOME%\bin目錄加到path變量,以便于從命令行下直接運(yùn)行ant
假定ant裝在c:\ant jdk裝d:\j2sdk1.4.0
則在命令行下執(zhí)行以下命令:
set ANT_HOME=c:\ant
set JAVA_HOME=D:\j2sdk1.4.0
set PATH=%PATH%;c:\ant\bin
在win2000命令提示符下工作時(shí),每次都必須進(jìn)行上面的設(shè)置,退出命令提示符后,這些變量的值又會(huì)恢復(fù)成原來(lái)的樣子。為了避免這些麻煩,可以在 控制面板\系統(tǒng)\高級(jí)\環(huán)境變量 中設(shè)置。
上述設(shè)置完成后,就可以使用ant了。
2.建立工程描述文件build.xml
用ant編譯規(guī)模較大的工程非常方便,每個(gè)工程都對(duì)應(yīng)一個(gè)build.xml文件,這個(gè)文件包含與這個(gè)工程有關(guān)的路徑信息和任務(wù)。下面是一個(gè)build.xml的例子:
<project name="logon" basedir="." default="dist">
<property name="dist.name" value="struts_demo"/>
<property name="src" location="src"/>
<property name="build" location="WEB-INF/classes"/>
<property name="dist" location="D:/tomcat/webapps/dist"/>
<!-- Build working classpath -->
<path id="project.class.path">
<pathelement path ="WEB-INF/lib/struts.jar"/>
<pathelement path ="WEB-INF/classes"/>
<pathelement path ="${classpath}"/>
</path>
<target name="init">
<tstamp/>
<!-- Create the build directory structure used by compile -->
<delete dir="${dist}"/>
</target>
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${build}">
<classpath refid="project.class.path"/>
</javac>
</target>
<!-- Build binary distribution -->
<target name="dist" depends="compile"
description="Create binary distribution">
<mkdir dir="${dist}"/>
<war destfile="${dist}/${dist.name}.war"
webxml="WEB-INF/web.xml">
<lib dir="WEB-INF/lib"/>
<classes dir="WEB-INF/classes"/>
<fileset dir="${basedir}"/>
</war>
</target>
</project>
要構(gòu)建的工程目錄如下:
struts_demo
+--jsp
|
+--src
|
+--WEB-INF
| +--classes
| |
| +--lib
| |
| +--web.xml
|
+--build.xml
每個(gè)build.xml文件都包含一個(gè)project和至少一個(gè)target。target包含任務(wù)元素,任務(wù)是一段可執(zhí)行代碼,每個(gè)任務(wù)元素都有一個(gè)id屬性,以便于在文件中引用。ant有內(nèi)置任務(wù)集可供使用,如上面文件中用到的property、javac和war,分別完成設(shè)置屬性、編譯和打包任務(wù)。當(dāng)然如果需要的話也可以寫自己的任務(wù)。
build.xml的根元素是progject,它有三個(gè)屬性name default basedir,其中default是必需的。name指定工程的名字,basedir表示工程的基路徑,設(shè)置為"."表示build.xml所在的路徑。default表示默認(rèn)的target,運(yùn)行ant時(shí)如果不指定target,則用default指定的target.
property任務(wù)用來(lái)設(shè)置屬性,一個(gè)工程可以設(shè)置很多屬性,屬性有名字和值,屬性設(shè)置后可以在后面引用。
<property name="dist.name" value="struts_demo"/>設(shè)置一個(gè)名字為dist.name的屬性,其值為struts_demo,后面使用時(shí)用${dist.name}引用,表示字符串struts_demo.
<property name="src" location="src"/>設(shè)置一個(gè)名字為src的屬性,它的值是一個(gè)路徑,用location設(shè)置。如果location內(nèi)容以/或\或D:\ C:\之類開始,表示絕對(duì)路徑,否則表示相對(duì)路徑,相對(duì)于project中設(shè)置的basedir.
使用path或classpath可以設(shè)置類的路徑,后面引用時(shí)用id設(shè)置的值
構(gòu)建工程最常用的ant內(nèi)置任務(wù):
mkdir: 創(chuàng)建目錄,dir=要?jiǎng)?chuàng)建的目錄
delete: 刪除文件或文件夾 dir=要?jiǎng)h除的文件或文件夾
javac: 編譯java源文件,java源文件放在srcdir指定的文件夾中,生成的.class文件按照 package語(yǔ)句組織目錄,存放在destdir指定的文件夾中。要注意源文件的目錄組織要與package語(yǔ)句相一致
war: 為web應(yīng)用程序打包,destfile指定打包后生成的文件名,webxml指定所用的web.xml文件。<fileset dir="${basedir}"/>將basedir目錄下所有的文件也放在包中
上面的build.xml例子中,target中的屬性depends表示在執(zhí)行本target之前必須要做的target,
例如dist 的depends=compile,意思是在用dist打包之前必須先用compile編譯。這樣當(dāng)執(zhí)行dist時(shí)首先執(zhí)行compile
3.運(yùn)行ant:
使用ant.bat可以直接運(yùn)行ant,如果不帶任何參數(shù),ant會(huì)在當(dāng)前路徑下搜索build.xml文件,如果找到,就運(yùn)行project的default指定的target.也可以帶參數(shù)來(lái)選擇build.xml文件和要運(yùn)行的target
對(duì)于上面的例子,假定build.xml所在的目錄為D:\struts_demo\ ,則下面三種執(zhí)行方式效果是一樣的:
1. cd d:\struts_demo
ant
2. ant -buildfile d:\struts_demo\build.xml
3. ant -buildfile d:\struts_demo\build.xml dist
如果執(zhí)行ant -buildfile d:\struts_demo\build.xml compile,則執(zhí)行compile target
有關(guān)ant使用和build.xml文件內(nèi)容,在ant的manual中有詳細(xì)的描述。
聯(lián)系客服