You are on page 1of 10

CCH S DNG ANT TRONG JAVA

November 11th, 2009 | Tags: ANT IN JAVA, ANT TRONG JAVA


1.Gii thiu:
Hy tng tng xem khi bn ang thc hin mt n ln bng Java, n
bao gm nhiu tp tin java v nhng lp (class) ph thuc vo nhng lp
khc hay nhng lp stub hoac driver chang hn. Chng c cha trong
nhiu th mc khc nhau, v kt qua thu c cng cn at trong nhiu
th mc . v kt qua l bn phai dung nhng cng c bin dich v phai
t mnh thao tc tt ca, v tt nhin iu s lm cho bn mt hng
gi thc hin vic . Vy ti sao ta khng pht trin mt chong
trnh c th thc hin c nhng vic m chng ta cn v cng c
chnh l ANT ( Bn c th tham khao thm ti website
http://jakarta.apache.org/ant/ ).
ANT ( Another Neat Tool ), l cng c xy dng h tr ac bit cho lp
trnh bng Java nhng cng c th su dng cho nhiu th khc, v y l
cng c c vit hon ton bng Java nn khng ph thuc vo bt c
nn ng dng no. Ant rt hu ch trong cng vic phc tp i hoi phai
lp i lp li nhiu ln, v vy nn thch hp vi vic xu l mt cch
t ng v c chun ha. Ant dung inh dng XML lm co ch hot
ng cho cng c di dng nhng li hng dn ( instructions), do
d dng m rng v bao tr.
2.Ci at:
-Tai cng c Ant tu ia chi sau :
http://jakarta.apache.org/ant/index.html, sau giai nn vo mt th
mc.
-Thm ng dn n th mc /bin trong th mc giai nn vo bin mi
trng PATH.
-Thm vo bin mi trng CLASSPATH ng dn n nhng tp tin .jar
trong th mc /lib trong th mc giai nn. ( bit thm chi tit xin
xem thm ti th mc /docs/manual/install.html )
-
3.Co ban:
Tp tin xy dng Ant c vit di dng XML, nn chi cn c mt phn
mm son thao van ban l c th xy dng tp tin Ant. Sau y l v d
on gian:
V d 1 : build.xml
<?xml version="1.0"?>
<project name="test" default="compile" basedir=".">
<property name="src" value="."/>
<property name="build" value="build"/>
<target name="init">
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init">
<!- - Compile the java code - ->
<javac srcdir="${src}" destdir="${build}"/>
</target>
</project>
M ta:
<?xml version="1.0"?>
V y l tp tin xml nn lun c bt u bng the ny.
<project name="test" default="compile" basedir=".">
The gc (root element) cua tp tin Ant l <project>, n c 3 thuc tnh
sau:
-name: y l tn cua cua ti
-default: mc ny chi inh the <target> mac inh khi khng c the
<target> no c chi inh, y l thuc tnh bt buc phai c.
-basedir: chi inh th mc gc m bn trong tp tin Ant tham chiu n,
nu mc ny bi bo qua th th mc hin hnh cha tp tin Ant s c su
dng.
<property name="src" value="."/>
<property name="build" value="build"/>
The property cho php khai bo bin su dng trong tp tin Ant, thuc
tnh name dung at tn cho bin, v thuc tnh value cha gi tri cua
bin . tham chiu n gi tri cua bin ny ta dung c php sau $
{name-property}, nh trong v d trn tham chiu n bin src ta
dung nh sau ${src}
<target name="init">
<mkdir dir="${build}"/>
</target>
The <target> dung bao boc mt nhm cc hnh ng, mi the c mt tn
c th tham chiu n bt k u, c th tu bn ngoi di dng
dng lnh, hay tu bn trong thng qua tu kho depends, hoac c th tu
mt li goi trc tip. Trong v d trn ta c the <target> at tn l
init, n s to ra mt th mc bng cch su dng the <mkdir> vi tn
c chi inh bi bin build c khai bo trn
The <target> c nhng thuc tnh sau:
-name: at tn cho the c th tham chiu n sau ny, thuc tnh ny
bt buc phai c
-depends: y l mt danh sch cha cc target khc m the target ny
ph thuc, cc target c phn cch bng du phy, cc target nm
trong danh sch ny phai c thc thi trc the <target> ny.
-if: cho php thm iu kin xt xem c thc hin cc hnh ng
trong the <target> khng da trn gi tri cua bin. V d if=dk ta c
th hiu nh sau: nu bin dk c gn gi tri bt k th s thc hin
cc hnh ng trong the <target>.
-unless: thuc tnh ny ngc li vi if
-description: dung m ta ngn gon cho the <target>
<target name="compile" depends="init">
<!- - Compile the java code - ->
<javac srcdir="${src}" destdir="${build}"/>
</target>
Nh m ta trn, v thuc tnh depends=init nn the <target> ny
phai c thc thi sau khi the target c tn l init c thc thi.
Ta thy c the javac c su dng trong v d trn, the ny c th hiu
nh mt nhim v, nhng nhim v cn thc hin c lng trong the
target. Trong trng hp ny th mc cha m ngun (srcdir) c gn
bng bin src m ta khai bo v th mc ch m ta cn xut kt qua
ra (destdir) c gn bng bin build, v khi target thc thi th javac
s bin dich cc tp tin java trong th mc srcdir (tham chiu n bin
src) v tra v kt qua l cc tp tin class c at trong th mc
destdir (tham chiu n bin build). Ngoi lnh javax ra, ant cn h
tr lnh java thc thi chong trnh.
Sau khi hiu r nhng tnh nang cua tung the, hy thc hin v d trn
theo cc bc sau:
-Chp m ngun v d trn v lu li thnh tp tin build.xml vo th
mc test
-To mt file java vi ni dung bt k v d nh sau:
public class test {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
-Lu tp tin java trn vo chung th mc test
-Sau chy dng lnh : ant -v
-ng lnh ny s thc thi theo hng dn trong tp tin build.xml, n
s to ra th mc build cha tp tin class c bin dich tu tp tin
java. Tham s -v s hin thi thng tin trong qu trnh lnh ant thc
thi (cc tham s cua lnh ant tham khao thm ti ph lc A).
.M ta chi tit v mt n ac trng:
hi bt u tin hnh mt n, thng thng ta s to ra nhng th
mc sau :
-src: cha cc tp tin m ngun
-build: cha cc tp tin tra v sau khi bin dich
-lib: cha cc tp tin dung lm th vin cho chong trnh
By gi ta s tin hnh cc bc sau su dng Ant:
-u tin to tp tin Antemo.java vi ni dung nh sau:
import javax.swing.;
import java.awt.;
public class Antemo extends Jrame {
public Antemo() {
super("Ant emo");
magecon icon = new magecon("image.jpeg");
getContentPane().add(new JLabel(icon));
setefaultCloseperation(Jrame.XTNCLS);
pack();
setVisible(true);
}
public static void main(String args[]) {
new Antemo();
}
}
-To 3 th mc src, build, lib trong th mc test ta to trn, sau
lu tp tin Antemo.java v image.jpeg vo th mc src
-Bc tip theo ta s to tp tin build.xml vi ni dung nh sau:
<?xml version="1.0"?>
<project name="Antemo" default="all" basedir=".">
<property name="src" value="src"/>
<property name="build" value="build"/>
<property name="lib" value="lib"/>
<target name="all" depends="Antemo" description="Builds the whole
project">
<echo>oing all</echo>
</target>
<target name="Antemo" description="Builds the main Antemo project">
<echo>oing Antemo</echo>
<copy file="${src}/image.jpeg" tofile="${build}/image.jpeg"/>
<javac srcdir="${src}" destdir="${build}"/>
</target>
</project>
-Lu tp tin build.xml vo th mc test, v chy ant nh phn trn. t
qua thu c l:
Buildfile: build.xml
Antemo:
[echo] oing Antemo
[copy] Copying 1 file to C:docbookdocprojsrcitemsantfilesbuild
[javac] Compiling 1 source file to blahblahblahbuild
all:
[echo] oing all
BL SCCSSL
Total time: 2 seconds
Lu : nu mun su dng cc tham s trong cu lnh java nh : javac -v
-listfiles . ta s lm bng cch gn cho cc thuc tnh gi tri bng
true, v d nh mun trong qu trnh bin dich mun hin thi danh
sch cc tp tin c bin dich ta thm vo the javac trn thuc tnh
sau: listfiles=true.
Trong v d trn c mt the mi l the <copy> , dung sao chp cc
tp tin vo cc th mc cn thit, vi thuc tnh srcdir chi inh th
mc ang cha tp tin cn sao chp, destdir chi inh th mc cn sao
chp n. Mac inh, ant chi sao chp li nhng tp tin sao chp ri
khi chng c thay i, nu mun ant lun sao chp mi khi thc thi
th ta s gn gi tri true cho thuc tnh overwrite cho the copy.
The <echo> s in ni dung ra mn hnh thc thi.
hiu r hon ta sua li ni dung cua tp tin Antemo.java nh sau:
public Antemo() {
super("Antemo");
magecon icon = new magecon("image.jpeg");
JButton exitButton = new JButton("xit");
exitButton.addActionListener(new xitControl());
JButton aboutButton = new JButton("About");
aboutButton.addActionListener(new AboutControl());
getContentPane().setLayout(new lowLayout());
getContentPane().add(new JLabel(icon));
getContentPane().add(aboutButton);
getContentPane().add(exitButton);
setefaultCloseperation(Jrame.XTNCLS);
pack();
setVisible(true);
}
Tip theo, to tp tin xitControl.java vi ni dung sau:
import java.awt.event.;
public class xitControl implements ActionListener {
public void actionPerformed(Actionvent e) {
System.exit(0);
}
}
To tp tin AboutControl.java:
import java.awt.event.;
public class AboutControl implements ActionListener {
public void actionPerformed(Actionvent e) {
new AboutPopup();
}
}
To tp tin AboutPopup.java:
import javax.swing.;
import java.awt.;
public class AboutPopup extends Jrame {
public AboutPopup() {
super("About");
String message = "n";
message="Bye bye world ???";
setefaultCloseperation(Jrame.SPSNCLS);
setSie(new imension(300,300));
JTextPane messagePane = new JTextPane();
messagePane.setBackground(Color.BLAC);
messagePane.setoreground(Color.GA);
messagePane.setditable(false);
messagePane.setText(message);
getContentPane().add(messagePane);
setesiable(false);
setVisible(true);
}
}
Lu tt ca cc tp tin java vo th mc src v sua i li tp tin
build.xml nh sau:
- phn the target Antemo:
<target name="Antemo" depends="AboutControl,xitControl"
description="Builds the main Antemo project">
<echo>oing Antemo</echo>
<copy file="${src}/image.jpeg" tofile="${build}/image.jpeg"/>
<javac srcdir="${src}" destdir="${build}" includes="Antemo.java"/>
</target>
Ta thm vo depends="AboutControl,xitControl" bo cho ant bit
rng the target ny s c thc thi sau khi the target c tn
AboutControl v xitControl c thc thi. Ngoi ra trong the javac c
thm thuc tnh includes chi ra cho ant bit tp tin no cn c
bin dich, trong v d trn ta bo cho ant bit rng chi bin dich tp
tin Antemo.java trong th mc c chi inh trong thuc tnh srcdir.
Gi tri cua includes c th l danh sch cc tp tin cn c bin
dich, nu bo qua includes th ant s bin dich tt ca.
-V the target Antemo c thuc tnh depends=AboutControl,xitControl
nn ta s thm vo 2 the target mi vi tn tong ng nh sau:
<target name="AboutControl" depends="AboutPopup"
description="Builds AboutControl">
<echo>oing AboutControl</echo>
<javac srcdir="${src}" destdir="${build}" includes="AboutControl.java"/>
</target>
<target name="xitControl" description="Builds xitControl">
<echo>oing xitControl</echo>
<javac srcdir="${src}" destdir="${build}" includes="xitControl.java"/>
</target>
The target AboutControl c thuc tnh depends=AboutPopup chi ra
rng the target ny s c thc thi sau khi the target AboutPopup c
thc thi. V th ta s to thm the target c tn l AboutPopup nh sau:
<target name="AboutPopup" description="Builds AboutPopup">
<echo>oing AboutPopup</echo>
<javac srcdir="${src}" destdir="${build}" includes="AboutPopup.java"/>
</target>
-Cui cung ta s thm vo the target Clean, c dung xo tp tin
trong th mc c chi inh nh sau:
<target name="Clean" description="emoves previous build">
<delete verbose="true">
<fileset dir="${build}"/>
</delete>
</target>
Trong the target trn ta c the <delete> chi ra rng ta mun xo,
thuc tnh verbose=true s in ra danh sch cc tp tin c xa khi
thc thi the target. The <fileset> dung chi ra th mc cha cc tp
tin cn xa vi thuc tnh dir cha ng dn n th mc . Nu mun
xa ca th mc th gn gi tri true cho thuc tnh
includemptyirs. (tham khao thm v the fileset trong phn ph lc B)
xo cc tp tin bin dich trc kia, ta chy lnh sau:
ant Clean
t qua nh sau:
Buildfile: build.xml
Clean:
[delete] eleting 2 files from blahblahbuild
[delete] eleting blahblahblahbuildAntemo.class
[delete] eleting blahblahblahbuildimage.jpeg
BL SCCSSL
Total time: 1 second
Tip theo ta s thc thi lnh ant khng cn tham s no ca, do ant
s thc thi the target c quy inh trong thuc tnh default c nu
trn
t qua nh sau:
Buildfile: build.xml
AboutPopup:
[echo] oing AboutPopup
[javac] Compiling 1 source file to blahblahblahbuild
AboutControl:
[echo] oing AboutControl
[javac] Compiling 1 source file to blahblahblahbuild
xitControl:
[echo] oing xitControl
[javac] Compiling 1 source file to blahblahblahbuild
Antemo:
[echo] oing Antemo
[copy] Copying 1 file to blahblahblahbuild
[javac] Compiling 1 source file to blahblahblahbuild
all:
[echo] oing all
BL SCCSSL
Total time: seconds
C th thy c cc the target c thc thi theo th t c quy inh
bi thuc tnh depends trong cc the target.
.Nng cao:
h tr cho vic iu khin s lu thng (flow of control) cua tin
trnh, ant cung cp c php goi nhng the <target> khc bng c php
sau:
<antcall target=target-name>
Gia su ta mun tin trnh thc hin theo c php trong Java nh sau:
if( condition ) {
if( inner-condition ) {
A
} else {
B
}
} else {
C
}
Trong ant ta c th vit nh sau:
<?xml version="1.0"?>
<project name="low.f.Control" default="nested-if" basedir=".">
<target name="nested-if">
<condition property="condition">
<available file="fileone"/>
</condition>
<antcall target="then"/>
<antcall target="else"/>
</target>
<target name="then" if="condition">
<echo>THN B XCT</echo>
<condition property="inner-condition">
<available file="filetwo"/>
</condition>
<antcall target="inner.then"/>
<antcall target="inner.else"/>
</target>
<target name="inner.then" if="inner-condition">
<echo>NN THN B XCT</echo>
</target>
<target name="inner.else" unless="inner-condition">
<echo>NN LS B XCT</echo>
</target>
<target name="else" unless="condition">
<echo>LS B XCT</echo>
</target>
</project>
Trong c php trn, ta su dng thuc tnh if v unless xt iu
kin, u tin nested-if c goi, n s kim tra xem tp tin c tn
fileone c tn ti hay khng, nu tn ti th bin condition s c
gn gi tri, sau goi the target then v the target else. hi the
target then c goi, n s kim tra iu kin thng qua bin
property c tn l condition, nu bin ny c gn gi tri th s
thc hin cc hnh ng trong the target ny. Trong the target then
li xt xem tp tin filetwo c tn ti hay khng, nu tn ti th
bin inner-condition s c gn gi tri, sau goi the target
inner.then v the target inner.else. u trnh trn c th c m
ta bng so sau:
Ph lc A
Tham sM ta
-vHin thi thng tin trong qu trnh thc thi ant
-projecthelpHin thi thng tin v cc the target hin c trong tp tin
build.xml
Ph lc B
ileSet c dung nh mt b loc chi ra nhng tp tin thoa mn nhng
iu kin no bng cch dung mt hay nhiu mu c chi inh.
ileList l danh sch nhng tp tin thoa mn iu kin, ileSet dung
PatternSets v Patterns inh ngha nhng hnh ng cn thc hin.
-du ? i din cho 1 k t bt k
-du i din cho nhiu k t bt k hay khng c k t no ca
-du i din cho nhiu th mc bt k hay khng c th mc no ca
ileset phai chi inh th mc gc (Base directory) thng qua thuc tnh
dir, tu tnh ton cc ng dn c lin quan.
<fileset dir="BAS"/>
Hay:
<fileset dir="BAS">
</fileset>
V du 1:
<fileset. dir="." includes="/.blah /.bleh"
Trong v d trn, bao gm tt ca cc tp tin c ui l .blah hay .bleh
trong th mc hin ti v trong cc th mc con cua th mc hin ti.
V d 2:
<fileset. dir=".">
<include. name="/bl"/>
<exclude name="/blah/"/>
</fileset>
Ta c th vit c php nh trn chi ra rng s bao gm tt ca cc
tp tin c tn cha chui bl trong th mc hin ti v trong cc th
mc con. V s loi bo nhng tp tin nm trong th mc c tn blah
trong th mc hin ti hay trong cc th mc con. Ch rng ta su dng
the <include> v the <exclude> vi thuc tnh name thay v dung thuc
tnh includes v excludes trong the <fileset>
Vy khi ta cn dung nhiu ln 1 mu (pattern) no li phai vit li
nhiu ln chang, cu tra li l dung the <patternset> vi c php
sau:
<fileset dir=".">
<patternset id="blah">
<include name="/bl"/>
<exclude name="/blah/"/>
</patternset>
</fileset>
Sau khi khai bo thuc tnh id cua the patternset, nu sau ny cn dung
n ta chi cn tham chiu n the patternset trn vi c php sau:
<fileset dir=".">
<patterset refid="blah"/>
</fileset>
Ta cng c th dung thuc tnh if v unless trong the include v
exclude a ra iu kin thm vo (include) hay bo i (exclude).
V d 3:
<fileset dir=".">
<include name="/extensions/.java" if="version.professional"/>
</fileset>
Trong v d ny chi ra rng s bao gm tt ca tp tin .java trong th
mc extensions nu bin version.professional c gn gi tri bt k.
V d :
<fileset dir=".">
<exclude name="chinese.lang" unless="language.chinese"/>
</fileset>
Trong v d ny s loi bo tp tin chinese.lang nu bin
language.chinese khng c gn gi tri no ca.
Ngoi ra, nu nh gi tri cua thuc tnh name cua the include hay
exclude qu nhiu ta c th to danh sch cc tp tin trong mt tp tin
khc v tham chiu n tp tin bng bng the
<includesfile>,<excludesfile> vi c php sau:
<fileset dir=".">
<includesfile name="some.file"/>
</fileset>
Tp tin some.file c th c ni dung nh sau:
bl?h.bl?h
.java
ileList: tong t ileSet nhng khng h tr nhng k t i din ? v
. Ta phai lit k ht nhng tp tin ngan cch nhau bi du phy hay
khoang trng trong thuc tnh files.V ta cng c th at id v tham
chiu n ileList thng qua thuc tnh refid nh sau:
<filelist id="blah" dir="." files="blah.blah bleh.bleh"/>
Tham chiu n ileList:
<filelist refid="blah"/>

You might also like