由于过分陷入一个视角的具体实现细节中,可能让自己迷失了真正的方向。 第一项修炼:自我超越(Personal Mastery) 第二项修炼:改善心智模式(Improving Mental Models) 第三项修炼:建立并同愿景(Building Shared Vision) 第四项修炼:团体学习(Team,Learing)

用Ant来打包

上一篇 / 下一篇  2006-12-05 11:14:45

Ant来打包

Eclipse内置了AntAnt是一种类似于批处理程序的软件包,它主要繁琐的工作是编写和调试自动处理脚本(一个XML文件),但只要有了这个脚本,我们就可以一键完成所有的设定工作。

~;F\^1S1H!w5B.|6g0

本节还是以myswt这个应用程序项目的打包为例,用Ant来完成“编译->打成JAR包->复制项目引用库->复制本地化文件swt-win32-3063.dll->输出API文档”这五步。

2Q X4s N.c|0

1、在myswt项目根目录下,创建最主要的build.xml文件

~,H E*m`+HD0

<?xml version="1.0"?>

n_+`AB0

<project name="myswt project" default="api_doc">51Testing软件测试网X+M zx$V!e0W

    <!-- 定义目录变量 -->

0\8Ib&K2b0

    <property name="src.dir" value="src" />51Testing软件测试网!hx-{8ZWF

    <property name="bin.dir" value="bin" />51Testing软件测试网 R'K$S9\#Riq

    <property name="eclipse_plugins.dir" value="c:/eclipse/plugins" />51Testing软件测试网#c?T6N(V

    <property name="dist.dir" value="d:/dist" />51Testing软件测试网m2d L,C"kh

    <property name="doc.dir" value="/${dist.dir}/api" />

d;E3{#}X5hPBJg0

    <property name="swt.dll" value="/swt-win32-3063.dll" />51Testing软件测试网1T p` j{*d

    <!-- 定义编译文件时所引用的库 -->51Testing软件测试网7dGB;P*u}!K

    <path id="master-classpath">51Testing软件测试网-Pz6A/aP7c]d

        <fileset dir="${eclipse_plugins.dir}" id="project_lib">51Testing软件测试网%k6{ a@C

            <include name="org.eclipse.ui.workbench_3.0.1/workbench.jar"/>

4FAO,xe0

            <include name="org.eclipse.swt.win32_3.0.1/ws/win32/swt.jar"/>

[%Z [Vl m;AB0

            <include name="org.eclipse.jface_3.0.0/jface.jar"/>51Testing软件测试网{$A;J2f`1@O

            <include name="org.eclipse.osgi_3.0.1/osgi.jar"/>51Testing软件测试网mF3NKD

            <include name="org.eclipse.osgi_3.0.1/core.jar"/>

W_|$Y']!U,c0

            <include name="org.eclipse.osgi_3.0.1/resolver.jar"/>

EQ&V!p9_n&A0

            <include name="org.eclipse.osgi_3.0.1/defaultAdaptor.jar"/>

Hv/e5Q }Z2?0

            <include name="org.eclipse.osgi_3.0.1/eclipseAdaptor.jar"/>

s+DkS*x0Iu0

            <include name="org.eclipse.osgi_3.0.1/console.jar"/>51Testing软件测试网9YF5yV:L8O${$}E

            <include name="org.eclipse.core.runtime_3.0.1/runtime.jar"/>

j-y,G5g/x8~0

            <include name="org.eclipse.jface.text_3.0.1/jfacetext.jar"/>

]q"B ]fn q:Y8q0

            <include name="org.eclipse.ui.workbench.compatibility_3.0.0/compatibility.jar"/>

H M6{0w2fOK$k0

        </fileset>51Testing软件测试网6^+u{)S(n~

    </path>51Testing软件测试网$j0iQ8S6_[.f

 51Testing软件测试网#@a|X'KC)eX&K

    <!-- 首任务(空)-->51Testing软件测试网]_1n/T s0^;Q(?

    <target name="init"/>51Testing软件测试网w,X:]2U.b

    <!-- 编译 -->

0u4`f2E+W$W&Pl0

    <target name="compile" depends="init">51Testing软件测试网e P{cNH!D

        <delete dir="${bin.dir}"/>51Testing软件测试网 g%?7Yx6b:D;X$f _7r

        <mkdir dir="${bin.dir}"/>

/m j0Y*NE+j)Ws yd0

        <!--编译源程序-->

Z;HR h | ^jc0

        <javac srcdir="${src.dir}" destdir="${bin.dir}" target="1.4">

u l2jT*?0V0

            <classpath refid="master-classpath"/>

&CA+_h;},co2EN0

        </javac>

,t`QYF.L0

        <!--复制图标目录-->51Testing软件测试网:]$a`&Tk&Qh}3RI

        <mkdir dir="${bin.dir}/icons"/>51Testing软件测试网w JU(w#{P Y

        <copy todir="${bin.dir}/icons">

v2x-r4k_8u!IL;E0

            <fileset dir="icons"/>

d6{1]3zyd { lG0

        </copy>51Testing软件测试网6N"O]8c.QO

    </target>51Testing软件测试网1^%v"~CP| RZa1e

    <!-- 打包 -->

;J(H)LP6yB)uC0

    <target name="pack" depends="compile">

#^ht7R^`]0

        <!-- bin目录压缩成JAR -->

'\,~"Wmar;WlYZz/_i0

        <delete dir="${dist.dir}"/>51Testing软件测试网:Gt7\3Z\3_"y

        <mkdir dir="${dist.dir}" />

9ab$},e3s0D*e|0

        <jar basedir="${bin.dir}" destfile="${dist.dir}/myswt.jar" manifest="ant_manifes.txt">

)Hs%A]5_0]Mt5]%Dg\G0

            <exclude name="**/*Test.*" />

m9rxNwhsyp0

            <exclude name="**/Test*.*" />51Testing软件测试网Z'FHK]^

        </jar>

O2^`2s7o%yx3l!nl Z0

        <!-- 复制用到的库 -->

\ c0h:~ HN6[&|0

        <mkdir dir="${dist.dir}/lib" />

+Uw$`*m ^(LB0

        <copy todir="${dist.dir}/lib">

T)H'_uA*B5w,oj0

            <fileset refid="project_lib"/>51Testing软件测试网%|y5Tl&v;goT_

        </copy>

B$@:_tO7@0

        <!-- 复制本地化文件 -->

lEUcyd*a-?0

        <copy todir="${dist.dir}" file="${swt.dll}"/>51Testing软件测试网Qj#k?*?3J+c

    </target>

By(NG8Qu$A0

    <!-- 输出api文档 -->

$ct ]9~+u}5p}0

    <target name="api_doc" depends="pack">

E-W7]h YNa0

        <delete dir="${doc.dir}"/>51Testing软件测试网'm,R"h*^O e(y UQ

        <mkdir dir="${doc.dir}" />51Testing软件测试网;Ar|2~g7B])W

        <javadoc destdir="${doc.dir}" author="true" version="true" use="true" windowtitle="MySWT API">

4t]m1I&K a5I:f0

            <packageset dir="${src.dir}" defaultexcludes="yes"/>51Testing软件测试网1n!D#rQY EG:{"A

            <doctitle><![CDATA[<h1>MySWT Project</h1>]]></doctitle>

{B7zx}&`0

            <bottom><![CDATA[<i>Document by ChenGang 2005.</i>]]></bottom>

u }ApoR0

        </javadoc>

:q@#l VN0

    </target>51Testing软件测试网#zR?)PTF6z

</project>

Nf2BLp#y0

代码说明:

CgA;[;r0

1property项是定义变量,比如<property name="swt.dll" value="/swt-win32-3063.dll" />,就是定义一个变量:swt.dll=swt-win32-3063.dll。以后用这个变量则是这样:${swt.dll}51Testing软件测试网2HR9f*Og"R-^)}8I

一般尽量将今后可能会变动的目录、文件等定义成变量,以方便维护。不象Java变量有类型的区分,Ant变量是不区别目录、文件等的,所以为了见名知意,在取变量名时,目录都加“dir”后缀,这个后缀是可以任取名的。51Testing软件测试网5RL\,z/`b

下面给出本例用到的变量的含义:51Testing软件测试网6^.ud ]i M$Kc

l           src.dir Java源文件路径。value="src"src是一个相对路径,它相对的是build.xml的所在目录位置(即项目根目录)。51Testing软件测试网 q^6n#hO Y/T

l           bin.dir Java编译文件的输出路径

Q)cEr6j#^0

l           eclipse_plugins.dir eclipseplugins目录51Testing软件测试网(~#N1];N0m~ O1e

l           dist.dir 打包文件的存放目录51Testing软件测试网,LDO*|g)[ r

l           doc.dir API文档的存放目录,这里用到了dist.dir变量,直接写value="d:/dist/api"也未尝不可。

`6qs%E }Y0

l           swt.dll SWT本地化文件。

0o#MF#}$T A0

2<path id="master-classpath">,定义编译文件时所引用的库,相当于classpath<fileset>项表示一个文件集,再深入一层的<include>项,则表示此文件集下的文件,它们的路径定位相对于<fileset>dir属性。<fileset>还有一个id属性,在后面复制引用库时会用到。

3iPez1F uB\$?0

也许有读者会问:“你是怎么知道要引用这些文件的?”回答:看项目根目录下的“.classpath”文件,就可以知道本项目要引用那些库了。实际上笔者是把.classpath复制一份后,然后用Editplus编辑而得。

9~B Q UX$T/kk0

3)接下来开始定义一些任务。首任务一般都让它为空(没有具体任务内容):<target name="init"/>51Testing软件测试网t1N6b/@!oO&A DqW

4Ant中的任务有着相互的依赖(depends)关系,这些依赖关系是通过depends属性来定义的。当要执行一个任务时,Ant先去执行这个任务的depends任务,……,Ant就这样一直往回找下去。比如:在本例的第二行default="api_doc",它定义了缺省任务是api_doc(输出api文档)->此任务的depends = pack(打包)->packdepends = compile(编译)->compiledepends=init(首任务),init没有depends。于是,Ant就从init开始依次往回执行任务:init->compile->pack->api_doc51Testing软件测试网0q/kSh!l:w%m`

如果你不想“输出api文档”,则将第二行的缺省任务定义成default="pack"即可,这时整个任务链就抛开了api_doc

f }]j*p&Xk7em0

5<delete dir="${bin.dir}"/>删除目录。<mkdir dir="${bin.dir}"/>新建目录51Testing软件测试网&G ? P:aSk;b/z

6)编译源程序,如下51Testing软件测试网;b?C \Ra&i6H5h0]

<javac srcdir="${src.dir}" destdir="${bin.dir}" target="1.4">

y/p ?$HUg.h4@!Q%p0

    <classpath refid="master-classpath"/>

!y]M3r?,c ]z0

</javac>51Testing软件测试网 Xm2F \xV.`C;J

l           srcdir 源文件目录,其子目录中的源文件也会被javac.exe编译。51Testing软件测试网*g }5k)PZ$W%c

l           destdir 编译文件输出目录。51Testing软件测试网~f+~9N ?3V|-g)^)x

l           target JDK1.4为编译目标。

~2?!|Y7M4v1w3B0

l           classpath 编译的classpath设置,refid是指引用前面设定的master-classpath

x5Wx$c^`%o0

7)将icons(即myswt/icons)目录的文件,复制到myswt/bin/icons目录中,如下:

5a3_^5VD:z.b+k/{0

<copy todir="${bin.dir}/icons">51Testing软件测试网st#fv`fX

    <fileset dir="icons"/>51Testing软件测试网\c5A0xmck|a

</copy>51Testing软件测试网 [,z'x e-n5k,WFQaE8|

8)将文件打成JAR

:S:N~pn!j)V2I9Q0

<jar basedir="${bin.dir}" destfile="${dist.dir}/myswt.jar" manifest="ant_manifes.txt">

z`#F a Z%u1Y)eA0

    <exclude name="**/*Test.*" />

OX9@+FaM'n0

    <exclude name="**/Test*.*" />

U$S1B#YMU0

</jar>

2@3Y_z.rNAu4Y0

l           basedir 源目录。51Testing软件测试网DfF{|f1}5u

l           destfile 目标目录和打成JAR包名。

X'wXr6CP0

l           manifest 打包清单文件(后面给出其内容)。

gT*WMvu0

l           exclude 使用了通配符将某一些文件排除不打包(主要是一些测试文件)。

Ds!C)DK8D0

9)如下,将project_lib的文件复制到d:/dist/lib目录中。project_lib是前面“定义编译文件时所引用的库”中的文件集的id。结果参数下图21.25

$X"UJMHS0\$OW-u0

<copy todir="${dist.dir}/lib">51Testing软件测试网~?Ph[p%^kQ

    <fileset refid="project_lib"/>51Testing软件测试网4j*S7x SRR4| ATVs

</copy>

Y'X*B bJ k0

10)将本地化文件复制到d:/dist目录中,如下:

it7k1p`'PMk x0

<copy todir="${dist.dir}" file="${swt.dll}"/> 

|1}W*EDJ;}y0

11)输出API文档(结果参数下图21.26

K,t7H.[S@2O0

<javadoc destdir="${doc.dir}" author="true" version="true" use="true" windowtitle="MySWT API">

(o#c:a&f]W0

    <packageset dir="${src.dir}" defaultexcludes="yes"/>51Testing软件测试网0p1[9B:P(FP-rR]C,o

    <doctitle><![CDATA[<h1>MySWT Project</h1>]]></doctitle>

h-a7v~\E{.v0

    <bottom><![CDATA[<i>Document by ChenGang 2005.</i>]]></bottom>51Testing软件测试网%Q_ZW Bt

</javadoc>51Testing软件测试网`7K9N0~P1wL:z

l           destdir 目标路径d:/dist/api51Testing软件测试网!O1?O#baB}G k

l           packageset 源文件目录51Testing软件测试网v:F#z;L0e

l           doctitle 标题51Testing软件测试网k8S,\v8J[|,Q W

l           bottom 标尾。

:^$B*PM WC0

2、创建打包清单

Pno|*Jcx0

为了避免和原来的manifes.txt同名,在项目根目录建立一个名为ant_manifes.txt的文件。这个文件内容中最长的是Class-Path项,没有必要一个个字符的敲入,它可以由项目根目录下的“.classpath”编辑而得。

%s'p%a0M'g5JsY0

ant_manifes.txt内容如下:

$R.~;n K EX0

Manifest-Version: 1.051Testing软件测试网/x0QCM#B

Main-Class: jface.dialog.wizard.WizardDialog1

)hN&kW(D"@}'k-?g0

Class-Path: ./lib/org.eclipse.ui.workbench_3.0.1/workbench.jar ./lib/org.eclipse.swt.win32_3.0.1/ws/win32/swt.jar
v _%u:u6H9v0./lib/org.eclipse.jface_3.0.0/jface.jar ./lib/org.eclipse.osgi_3.0.1/osgi.jar ./lib/org.eclipse.osgi_
I,dqV6Qk,r03.0.1/core.jar ./lib/org.eclipse.osgi_3.0.1/resolver.jar ./lib/org.eclipse.osgi_3.0.1/defaultAdaptor.ja
6jo0j;N []0wr!b0r ./lib/org.eclipse.osgi_3.0.1/eclipseAdaptor.jar ./lib/org.eclipse.osgi_3.0.1/console.jar ./lib/org.ecl
-eL8TA6pca0ipse.core.runtime_3.0.1/runtime.jar ./lib/org.eclipse.jface.text_3.0.1/jfacetext.jar ./lib/org.eclipse.u
5m.j4P.cABi1i2y1D0i.workbench.compatibility_3.0.0/compatibility.jar
51Testing软件测试网4^|;k^ XK#p

3、如下图21.23所示,选择“Ant构建”来运行Ant

v B^QXh po0

51Testing软件测试网Z0MmSa)Y(H

21.23  运行“Ant构建”

rT'ty^6I9Z0

运行“Ant构建”后的结果如下图21.2326所示。

D H$j%u)azwc0

51Testing软件测试网P0SDJ)e1F4kH8e

21.24  控制台的输出51Testing软件测试网ExDF&L2lq oC

`vV1u MCpV0

21.25  输出文件的目录结构图51Testing软件测试网!w0k;W j9o

51Testing软件测试网L*b,wn*eRr:y

21.26  输出的API文档效果图

z p(`sw,Q} U0

4、运行打包结果

| |,V*{ rFF:d-}0

除了清单文件MANIFEST.MF之外,myswt.jar文件和21.1节所得的myswt.jar一样。本节没有创建run.bat批处理文件,而是用下图21.27所示的“右击myswt.jar->打开方式->javaw”的方式来运行myswt.jar51Testing软件测试网7Q [T`LPMT

51Testing软件测试网,N5\ Ha2B @\M

21.27  运行myswt.jar51Testing软件测试网 _7T"EM-A b(Zt9B


TAG: 用Ant来打包

 

评分:0

我来说两句

我的栏目

日历

« 2023-12-12  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 31946
  • 日志数: 26
  • 图片数: 3
  • 建立时间: 2006-12-05
  • 更新时间: 2007-01-04

RSS订阅

Open Toolbar