ANT应用

 

转自:来自JAVA-CN.COM

http://www.java-cn.com/club/html/71/n-471.html

1 Ant是什么?
L0]@w&/~D Apache Ant 是一个基于 Java的生成工具。JAVA中文站社区门户n s2PO@*Q:c6~
生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式)。随着应用程序的生成过程变得更加复杂,确保在每次生成期间都使用精确相同的生成步骤,同时实现尽可能多的自动化,以便及时产生一致的生成版本JAVA中文站社区门户U-J'nP b&U~zY7jX
2 下载、安装Ant JAVA中文站社区门户b0nS6Fw/n?
安装Ant
]a0hG[4Q 下载.zip文件,解压缩到c:/ant1.3(后面引用为%ANT_HOME%)

AL JK6h+N

:c)V&s7`!l;m pF6W!} 2.1 在你运行Ant之前需要做一些配置工作。JAVA中文站社区门户q5/K9p#/
• 将bin目录加入PATH环境变量。 JAVA中文站社区门户3t,OKIF{Xh w
• 设定ANT_HOME环境变量,指向你安装Ant的目录。在一些OS上,Ant的脚本可以猜测ANT_HOME(Unix和Windos NT/2000)-但最好不要依赖这一特性。
N)n#x r"|m(Ns)NH • 可选地,设定JAVA_HOME环境变量(参考下面的高级小节),该变量应该指向你安装JDK的目录。
o.R$g[d3dCd 注意:不要将Ant的ant.jar文件放到JDK/JRE的lib/ext目录下。Ant是个应用程序,而lib/ext目录是为JDK扩展使用的(如JCE,JSSE扩展)。而且通过扩展装入的类会有安全方面的限制。
7V.Y$~)U9T2DU X6p 2.2 运行Ant
JAVA中文站社区门户!cI+Pn+chmT0Mk

JAVA中文站社区门户JZ;sJ V,E

运行Ant非常简单,当你正确地安装Ant后,只要输入ant就可以了。 JAVA中文站社区门户8ki"d G,HK)Bv

JAVA中文站社区门户9T0bU`8EGN

? 没有指定任何参数时,Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。如果你用 -find 选项。Ant就会在上级目录中寻找buildfile,直至到达文件系统的根。要想让Ant使用其他的buildfile,可以用参数 -buildfile file,这里file指定了你想使用的buildfile。

|W(WI`0] JAVA中文站社区门户,m/ryX u*p6?

? 可以指定执行一个或多个target。当省略target时,Ant使用标签<project>的default属性所指定的target。 JAVA中文站社区门户'XB[_ xV W

JAVA中文站社区门户'Qz2dgs4dSh^l@%r


'o8X1Q kA5W3x&a^ 命令行选项总结:
5w`7Z*]n R'm ant [options] [target [target2 [target3] ...]]
bZ5mI {oIf Options:JAVA中文站社区门户#Ij-?*kdi9h
-help print this messageJAVA中文站社区门户/y!o!ZuD.[ib
-projecthelp print project help informationJAVA中文站社区门户;H y(c b*l^/1T
-version print the version information and exit
,J.f|D0H7d l /7pv|1{ [ -quiet be extra quiet
|$c.wH;lPoZ:_ p,H -verbose be extra verbose
-xx){#arXq -debug print debugging information
qk,e@M#z'JPa -emacs produce logging information without adornments
"r2t2lW]6t!R -logfile file use given file for log output
v"oy8@I$@ -logger classname the class that is to perform loggingJAVA中文站社区门户+`8E3~cgC}~+m
-listener classname add an instance of class as a project listenerJAVA中文站社区门户|1F.E k;j9[r
-buildfile file use specified buildfileJAVA中文站社区门户6O Boe(QN#bK|A
-find file search for buildfile towards the root of the filesystem and use the first one found
B u iz|6ZQ"v{] -Dproperty=value set property to value
(`RPR o1X ?0j:c } 例子
M _(b$b_}pC antJAVA中文站社区门户RLR;l/q
使用当前目录下的build.xml运行Ant,执行缺省的target。JAVA中文站社区门户3Nc#x&O /l
ant -buildfile test.xml
V;pBv6JZb"j 使用当前目录下的test.xml运行Ant,执行缺省的target。JAVA中文站社区门户LrR&~/Z]
ant -buildfile test.xml distJAVA中文站社区门户SQ/W l {
使用当前目录下的test.xml运行Ant,执行一个叫做dist的target。JAVA中文站社区门户V3qv7},sz S
ant -buildfile test.xml -Dbuild=build/classes dist
FhZ5eD(l` 使用当前目录下的test.xml运行Ant,执行一个叫做dist的target,并设定build属性的值为build/classes。

](c||W]E&Xc.j

,f9[J"x | 3 编写build.xml JAVA中文站社区门户7IO _CeT-W?,j

1/^pE{L2Q Ant的buildfile是用XML写的。每个buildfile含有一个project。JAVA中文站社区门户C0A'~5@W

;@ Og!^+n9a buildfile中每个task元素可以有一个id属性,可以用这个id值引用指定的任务。这个值必须是唯一的。(详情请参考下面的Task小节)

_,Y/V9ng_:bu

Ty8B/IMKK6| 3.1 ProjectsJAVA中文站社区门户-pCK*_ z

8]$Z3uD //kw*l project有下面的属性:
;YQ*zN,?;?5@G Attribute Description Required
f|/FZ5b ]!xM name 项目名称. NoJAVA中文站社区门户doNr"{vf
default 当没有指定target时使用的缺省target YesJAVA中文站社区门户 Q&T4R#]/@j }+M
basedir 用于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时,该属性被忽略。如果属性和basedir property都没有设定,就使用buildfile文件的父目录。 No
j6[vT*f S 项目的描述以一个顶级的<description>元素的形式出现(参看description小节)。

+f2|'g4g} ^G

7O#^_4?zZE 一个项目可以定义一个或多个target。一个target是一系列你想要执行的。执行Ant时,你可以选择执行那个target。当没有给定target时,使用project的default属性所确定的target。

5A2Os#o2_;I W JAVA中文站社区门户'zM[B.Duj

3.2 TargetsJAVA中文站社区门户5q4y9/9{4R*u$C8{

JAVA中文站社区门户.@3GgQ)|.Q3|eFN

一个target可以依赖于其他的target。例如,你可能会有一个target用于编译程序,一个target用于生成可执行文件。你在生成可执行文件之前必须先编译通过,所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。JAVA中文站社区门户"?-v2U$N Wx9zoN

JAVA中文站社区门户(B2}O+fMZft E

然而,应当注意到,Ant的depends属性只指定了target应该被执行的顺序-如果被依赖的target无法运行,这种depends对于指定了依赖关系的target就没有影响。JAVA中文站社区门户-NQr.[XWaE

w/_'`TL-Q`q Ant会依照depends属性中target出现的顺序(从左到右)依次执行每个target。然而,要记住的是只要某个target依赖于一个target,后者就会被先执行。JAVA中文站社区门户9Dg e+yL7f ~b
<target name="A"/>
2N!u-?T1m!zl!| <target name="B" depends="A"/>JAVA中文站社区门户u/mK D!cb
<target name="C" depends="B"/>
*~3L}9VT E7PS X/RP+t <target name="D" depends="C,B,A"/>
:~k|7s @)R P;v2d 假定我们要执行target D。从它的依赖属性来看,你可能认为先执行C,然后B,最后A被执行。错了,C依赖于B,B依赖于A,所以先执行A,然后B,然后C,最后D被执行。JAVA中文站社区门户`#N0?6{x7L n;[

tw,q;`OLP2_ 一个target只能被执行一次,即时有多个target依赖于它(看上面的例子)。

kyP0i I

&p3_CG})cA 如果(或如果不)某些属性被设定,才执行某个target。这样,允许根据系统的状态(java version, OS, 命令行属性定义等等)来更好地控制build的过程。要想让一个target这样做,你就应该在target元素中,加入if(或unless)属性,带上target因该有所判断的属性。例如:
!A^&`!mB S5ZIF <target name="build-module-A" if="module-A-present"/>JAVA中文站社区门户GilDO g0M A} e
<target name="build-own-fake-module-A" unless="module-A-present"/>JAVA中文站社区门户*|kD{-r ZN:a,n]
如果没有if或unless属性,target总会被执行。

{5R*qjl4X

-g X'w FC,mB 可选的description属性可用来提供关于target的一行描述,这些描述可由-projecthelp命令行选项输出。

wG{s8[@!K+z JAVA中文站社区门户 zrR1t5c^o6/

将你的tstamp task在一个所谓的初始化target是很好的做法,其他的target依赖这个初始化target。要确保初始化target是出现在其他target依赖表中的第一个target。在本手册中大多数的初始化target的名字是"init"。

1h`Lp}1c&k)Da-w:K

@"h(Y,e7g s7iW target有下面的属性:
H#H/Kg iI$_-H7a Attribute Description Required
:LK4t!zN0r-@n-L/ name target的名字 YesJAVA中文站社区门户"as i/tZGq
depends 用逗号分隔的target的名字列表,也就是依赖表。 No
BNJ } K/;l#c if 执行target所需要设定的属性名。 NoJAVA中文站社区门户1a,D5C D"?$Z[x(IV
unless 执行target需要清除设定的属性名。 No
fr,n:fXJ8A description 关于target功能的简短描述。 NoJAVA中文站社区门户k0r o;N*bA

K8O/4v0XS5Z!nW 3.3 TasksJAVA中文站社区门户#}3B5DV s$w

@a h2YG 一个task是一段可执行的代码。JAVA中文站社区门户f}-w@f+pB

O/3Quh)Z/^ 一个task可以有多个属性(如果你愿意的话,可以将其称之为变量)。属性只可能包含对property的引用。这些引用会在task执行前被解析。JAVA中文站社区门户h] SKzem

q8M[ EHCh 下面是Task的一般构造形式:
}/`[y c'^iF!W"@v!@ <name attribute1="value1" attribute2="value2" ... />
][5h$P/4FY.f l 这里name是task的名字,attributeN是属性名,valueN是属性值。JAVA中文站社区门户5n0yV(/R/

JAVA中文站社区门户2og$Q"b O|1T7Et3Xo

有一套内置的(built-in)task,以及一些可选task,但你也可以编写自己的task。

r1U*Rcu(`H JAVA中文站社区门户k:~!an9B} Jv^

所有的task都有一个task名字属性。Ant用属性值来产生日志信息。JAVA中文站社区门户5yF;Kb6Ny

8bo:h5h GO}"M"p 可以给task赋一个id属性:
B~U/YD'O"aV4a:b8W <taskname id="taskID" ... />
g%@n@aU 这里taskname是task的名字,而taskID是这个task的唯一标识符。通过这个标识符,你可以在脚本中引用相应的task。例如,在脚本中你可以这样:JAVA中文站社区门户 S6NI u!qh
<script ... >
j@pMz task1.setFoo("bar");
h2x#Z6v i5b/y </script>
@4TzH,Q!? 设定某个task实例的foo属性。在另一个task中(用java编写),你可以利用下面的语句存取相应的实例。JAVA中文站社区门户!~ [f B'mT,Sph
project.getReference("task1").JAVA中文站社区门户;t5A.i&ZY(i
注意1:如果task1还没有运行,就不会被生效(例如:不设定属性),如果你在随后配置它,你所作的一切都会被覆盖。

P-{ j2^nLwp-t JAVA中文站社区门户L7X P.e!pM` bbb;V D

注意2:未来的Ant版本可能不会兼容这里所提的属性,因为很有可能根本没有task实例,只有proxies。JAVA中文站社区门户vM+v%/y]&y

JAVA中文站社区门户aRa x,hwKp#l

3.4 Properties

R*s rQ5QI*J/yns

o? ^h4`"M 一个project可以有很多的properties。可以在buildfile中用property task来设定,或在Ant之外设定。一个property有一个名字和一个值。property可用于task的属性值。这是通过将属性名放在"${"和"}"之间并放在属性值的位置来实现的。例如如果有一个property builddir的值是"build",这个property就可用于属性值:${builddir}/classes。这个值就可被解析为build/classes。JAVA中文站社区门户IPfXo

;e4~V.S){r | 内置属性

wMt ]"@Z5H JAVA中文站社区门户'y q'tH @B:^%/

如果你使用了<property> task 定义了所有的系统属性,Ant允许你使用这些属性。例如,${os.name}对应操作系统的名字。

]%^/Q |'R-{

#`:S&]^TO4D 要想得到系统属性的列表可参考the Javadoc of System.getProperties。

&K!c.D!j/_"~

4Q[,O?^#P+@4XU3?|k 除了Java的系统属性,Ant还定义了一些自己的内置属性:
F%P4r,c;r-_6d basedir project基目录的绝对路径 (与<project>的basedir属性一样)。
7z`3q `.uQ./1Ex ant.file buildfile的绝对路径。
ex#?n;U ant.version Ant的版本。
7F8wp0Wy ww ant.project.name 当前执行的project的名字;由<project>的name属性设定.JAVA中文站社区门户K0I4ci1r4L
ant.java.version Ant检测到的JVM的版本; 目前的值有"1.1", "1.2", "1.3" and "1.4".

]B[en#Ri#v

/ht%U$ed)iV-I 例子
Y!k c+scp <project name="MyProject" default="dist" basedir="."> JAVA中文站社区门户 y'DVp,Hs

[#HMS,iJ)d{| <!-- set global properties for this build -->JAVA中文站社区门户Iq6j!aT g+Ph
<property name="src" value="."/>
5{&p;tq+pv <property name="build" value="build"/>JAVA中文站社区门户t.Y@/_7o1R
<property name="dist" value="dist"/> JAVA中文站社区门户8HS"S)P/ujW

F&T k$]bafqx <target name="init">
Fs3W3Sb#h:e <!-- Create the time stamp -->
1eRygXO0k)Oyh,H <tstamp/>JAVA中文站社区门户*e-n[0MF#I
<!-- Create the build directory structure used by compile -->
k P:`!T;p ~ k8P{ ` <mkdir dir="${build}"/>
:b'e:LNb </target>JAVA中文站社区门户/%G$aV]3|H

!dQ5f2Ho ](W@ <target name="compile" depends="init">
MKy+R.a <!-- Compile the java code from ${src} into ${build} -->
cyk P1p(Bv;AbQ <javac srcdir="${src}" destdir="${build}"/>
*wU,^ s)a i O'p </target>

(h|)r ]`!b2]

mPHn6Z:o <target name="dist" depends="compile">
{}A.H`doR$/ <!-- Create the distribution directory -->
N#SJGN-[0e-} <mkdir dir="${dist}/lib"/>JAVA中文站社区门户.r#}8a5k'^ t$x
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
'B"Eu*sojG;m <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>JAVA中文站社区门户-m MM.?#z/E
</target>JAVA中文站社区门户Wo;N_(Sb9b

#C(T:l"zW(U+U%B-Dt <target name="clean">
,u+d dW,B#[.c <!-- Delete the ${build} and ${dist} directory trees -->
TX1lG$ut9W <delete dir="${build}"/>
9t#m dG(|8EV <delete dir="${dist}"/>JAVA中文站社区门户YH d!N4//az
</target>

%};X F$c%]f;W} A JAVA中文站社区门户G7T+RzA7V

</project>JAVA中文站社区门户'Sd:W+^O@)pW

!Fu{!}yk8H{b 3.5 Path-like Structures
*zc0T"z6v 你可以用":"和";"作为分隔符,指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。

V /(r;URK"EV JAVA中文站社区门户v HfX(y5oC

当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是
/n(S [E <classpath>JAVA中文站社区门户)L6wW4Io#A7k{
<pathelement path="${classpath}"/>JAVA中文站社区门户,P$yCU_ cZWa
<pathelement location="lib/helper.jar"/>JAVA中文站社区门户)nH.s$P4Y)x^W2R
</classpath>
/t1fn L&c location属性指定了相对于project基目录的一个文件和目录,而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径--其他情况下,应该用多个location属性。

*S(zr8r.[Bj-j-rJ

W]R#gEl 为简洁起见,classpath标签支持自己的path和location属性。所以:JAVA中文站社区门户;H*t vC/%m
<classpath>JAVA中文站社区门户]c eO/y'G3u
<pathelement path="${classpath}"/>
8K+I+E d[ </classpath>JAVA中文站社区门户4W?2K ci Fw5wXu9x
可以被简写作:JAVA中文站社区门户*l4M3n"j-G Bn:V
<classpath path="${classpath}"/>
)E5_w)qS^ 也可通过<fileset>元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。JAVA中文站社区门户*i;z5{5{1~b:Hp:iy Dn
<classpath>JAVA中文站社区门户uh ?SPT%bEe
<pathelement path="${classpath}"/>
}#n lW;`[ R| <fileset dir="lib">
l&q2q)k | Omw'MjK <include name="**/*.jar"/>
stbw w7t9z8lI/*? </fileset>JAVA中文站社区门户 R i/Li6G%Nb3zfk
<pathelement location="classes"/>
T;I!`Y"wl2~ </classpath>
J?#G-@7c 上面的例子构造了一个路径值包括:${classpath}的路径,跟着lib目录下的所有jar文件,接着是classes目录。

@5R8u @&k0j*j

;L%E:E?7}Qmu 如果你想在多个task中使用相同的path-like structure,你可以用<path>元素定义他们(与target同级),然后通过id属性引用--参考Referencs例子。

#?!f{sKNLo

;S jd fb'f(foJj path-like structure可能包括对另一个path-like structurede的引用(通过嵌套<path>元素):
;g%HH#~2iayG)D /q:h <path id="base.path">JAVA中文站社区门户(t.p-m#AGt(d
<pathelement path="${classpath}"/>
ia/G/X'VA <fileset dir="lib">JAVA中文站社区门户qsU9w RXJ.L
<include name="**/*.jar"/>JAVA中文站社区门户.c*mj)}J%W[
</fileset>
H y?d/EK <pathelement location="classes"/>
+CXja1dX^:S Rt </path>JAVA中文站社区门户"}KT`P.i H
<path id="tests.path">
E0^sWR*| <path refid="base.path"/>JAVA中文站社区门户a"y+o)A'^?O
<pathelement location="testclasses"/>
S,f m1T2h3y Cc </path>JAVA中文站社区门户L'qt(A7s By*d
前面所提的关于<classpath>的简洁写法对于<path>也是有效的,如:
R[|4rW E{ `?)L&i^ <path id="tests.path">
IpL4v-h5t~ <path refid="base.path"/>
R0R*y9_*j] {5CoM6Oh <pathelement location="testclasses"/>
h^7Rlby } </path>
x.o ` lK&}A 可写成:JAVA中文站社区门户%C+b6@,Wcqx*a
<path id="base.path" path="${classpath}"/>JAVA中文站社区门户{'n.{e&d}
命令行变量

Z!] Cy;f-b6R%cyz JAVA中文站社区门户j;KmV!cu)N ln

有些task可接受参数,并将其传递给另一个进程。为了能在变量中包含空格字符,可使用嵌套的arg元素。
/`5X OQJc9xy%[ Attribute Description RequiredJAVA中文站社区门户ETQ x Q'N
value 一个命令行变量;可包含空格字符。 只能用一个
%p/DOR"ZDe line 空格分隔的命令行变量列表。 JAVA中文站社区门户Kf)Lu)A
file 作为命令行变量的文件名;会被文件的绝对名替代。
eKJ5v-Q"H(O path 一个作为单个命令行变量的path-like的字符串;或作为分隔符,Ant会将其转变为特定平台的分隔符。 JAVA中文站社区门户_/atc Y|P S'd U+x

.p-bUfA2Y 例子JAVA中文站社区门户4b S%uQ y I
<arg value="-l -a"/>
ql;o9K*iE A 是一个含有空格的单个的命令行变量。
IOY2Ar)U <arg line="-l -a"/>JAVA中文站社区门户2P2lcOV P
是两个空格分隔的命令行变量。JAVA中文站社区门户1[xe'UI(Vt
<arg path="/dir;/dir2:/dir3"/>JAVA中文站社区门户L//Jg/qBL
是一个命令行变量,其值在DOS系统上为/dir;/dir2;/dir3;在Unix系统上为/dir:/dir2:/dir3 。

Xs7m./7}~Kj

Qr$W)Et-z(| ReferencesJAVA中文站社区门户_;PPnA6cO N j

"p4Q6b i~R#n LlX buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块,这一属性就很有用--如多次使用<classpath>结构。

4a1hY6}.m"D

/a9Df"hx9xw 下面的例子:JAVA中文站社区门户:R)/#ek|z)A
<project ... >JAVA中文站社区门户$f#lhJ{0g,c
<target ... >
d@C?r-Vj <rmic ...>
7sF[,D{ ` xEE <classpath>
XnI4W` <pathelement location="lib/"/>
JF'z#C$p7P.G <pathelement path="${java.class.path}/"/>
|-uYsS,e nIMG <pathelement path="${additional.path}"/>
^#H4c {r'/9b </classpath> JAVA中文站社区门户.{"X0f8mDH^
</rmic>
6CJI'ab1ku4z2{ </target>
(fbn B?(xH ju <target ... >
1[/D`^/x/S'c <javac ...>
.wW M8In['p$F&o <classpath>
2W x.e"G dI~ <pathelement location="lib/"/>
6Kj bfAh:D m&iw <pathelement path="${java.class.path}/"/>
?(kL S&A5R <pathelement path="${additional.path}"/>
;|@/x1x_/D!y E"` </classpath>
wQ0R$f+^e2Er </javac>
/`.O7KI(Ut </target>
PR h c/t8jB:M </project>
%HF/r6_eD 可以写成如下形式:JAVA中文站社区门户5~{2Fh S%S!k|p
<project ... >
;xU9J on0f&Q <path id="project.class.path">
~9Y6c:t4N9K;b:_ <pathelement location="lib/"/>
hw0ch/R3|{ <pathelement path="${java.class.path}/"/>
:a$GCT-~-VD ? <pathelement path="${additional.path}"/>
P6mE'h{5N#R </path>JAVA中文站社区门户5F,M //v"K`w
<target ... >
4_ B~/pyv~q5/D `W0i <rmic ...>
5M9W$gt | <classpath refid="project.class.path"/>JAVA中文站社区门户V'i /9bGp,c8J#I2H
</rmic>
$C} e1_)RqI#u _ </target>JAVA中文站社区门户w'^$d;K zr/ V
<target ... > JAVA中文站社区门户r BC"@BYw'W
<javac ...>
*I5Z"J-ZgV f <classpath refid="project.class.path"/>
E+A'^v-[1CD/ZB? </javac>
!eWR&S#x#k7Jfq#MV </target>JAVA中文站社区门户 QV6vv5`rp
</project>JAVA中文站社区门户/z X*O,y+Y}
所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引用。
JAVA中文站社区门户I9v-doIP/{



TAG: ANT Ant 应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值