ant环境的搭建

Ant 是apache 工程的一个子工程,是一个基于Java的build工具。Ant 类似于make工具,但没有传统的make工具的缺点。传统的make往往只能限制在某一平台上使用,ant本身用java类实现,要构建的工程的配置文件用xml格式描述,可以很方便实现多平台编译。

版本

安装JDK

无论用什么开发工具,JDK(Java Development Kit)都是必不可少的。从 官网上下载完JDK后,直接安装即可。我把JDK安装到了目录C:\Java\jdk1.6.0_21中。


安装成功后,必须要设置环境变量,这和使用IDE开发有所不同。

需要设置一下三项环境变量。

  • JAVA_HOME = C:\Java\jdk1.6.0_21
  • PATH = %JAVA_HOME%\bin;
  • CLASSPATH = .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar (注意: 开头的点和;不能少)

  • JAVA_HOME

指的是java的安装目录,系统本身是不需要配置这项的,但是其他软件比如tomcat就会从这里找java如果你不配置他们就找不到java了

  • PATH

指的是系统查找执行文件的位置,比如如果你想直接在<开始-运行>里运行某个项目,这个东西必须在path目录里,不然系统会说找不到

  • CLASSPATH

这个指的是java程序自动查找class的位置,就如path一样,如果你发现什么时候运行时说找不到某个class,你就需要考虑这个了

以上3个变量不区分大小写,这是windows平台

liunx平台大同小异,除了一些分隔符比如windows平台使用的"\"liunx平台是使用"/",其他都一样.

安装Ant

这里下载最新版本的ant,下载后的ant为一个压缩包。压缩的格式可以选择zip,tar.gz 或tar.bz2。由于我是在windows下开发,所以选择了zip格式。下载后直接解压缩到C盘就可以了。当然可以放到其他任意位置。

同样,设置环境变量时必须的步骤。详细的安装参考ant在线手册

  • ANT_HOME=c:\ant
  • PATH=c:\ant\bin

上述设置完成后,就可以使用ant了。

建立build.xml

用Ant编译规模较大的工程非常方便,每个工程都对应一个build.xml文件,这个文件包含与这个工程有关的路径信息和任务。下面是一个build.xml的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?xml version="1.0" encoding="UTF-8"?>
   
<project name="dev" basedir="." default="dist">
   
  <target name="init">
   
   
  <property name="app.name" value="Chess"/>
        <property name="app.vendor" value="Nokia"/>
        <property name="app.midlet" value="GameMIDlet"/>
        <property name="app.project" value="antdemo"/>
        <property name="app.description" value="A demo for ant development"/>
   
    <property name="app.price" value="10"/>
   
   
    <property name="LIB_PATH" value="../lib"/>
    <property name="compile.classpath"  value="${LIB_PATH}/nokia60.zip"/>
    <property name="proguard.classpath" value="${LIB_PATH}/proguard.jar;${compile.classpath}"/>
  </target>
   
  <!--       -->
  <target name="clean" depends="init">
    <mkdir dir="dist"/>
    <delete file="dist/${app.project}.jad"/>
    <delete file="dist/${app.project}.jar"/>
    <delete dir="temp"/>
  </target>
  <target name="compile" depends="clean">
    <mkdir dir="temp/classes"/>
    <javac srcdir="src" destdir="temp/classes" bootclasspath="${compile.classpath}" target="1.1" encoding="UTF-8"/>
  </target>
  <target name="obfuscate" depends="compile">
    <jar jarfile="temp/${app.project}_tmp.jar" basedir="temp/classes"/>
    <java fork="yes" classname="proguard.ProGuard" classpath="${proguard.classpath}">
      <arg line="-libraryjars ${proguard.classpath}"/>
      <arg line="-injars temp/${app.project}_tmp.jar"/>
      <arg line="-outjar temp/${app.project}_obf.jar"/>
      <arg line="-defaultpackage ''"/>
      <arg line="-dontusemixedcaseclassnames"/>
      <arg line="-keep public class ${app.midlet}"/>
      <arg line = "-overloadaggressively"/> 
      <arg line="-keepclasseswithmembers public class ${app.midlet} {public void startApp();public void destroyApp(boolean);}"/> 
    </java>
    <mkdir dir="temp/obfuscate"/>
    <unjar src="temp/${app.project}_obf.jar" dest="temp/obfuscate"/>
    <!--
      <mkdir dir="temp/obfuscate"/>
      <copy todir="temp/obfuscate">
      <fileset dir="temp/classes"/>
      </copy>
    -->
  </target>
  <target name="preverify" depends="obfuscate">
    <mkdir dir="temp/build"/>
    <exec executable="${LIB_PATH}/preverify.exe">
      <arg line="-classpath ${compile.classpath} -d temp/build temp/obfuscate"/>
    </exec>
  </target>
  <target name="copyres" depends="preverify">
    <mkdir dir="temp/res"/>
    <copy todir="temp/res">
      <fileset dir="res" includes="manifest.mf, *.png"/>
    </copy>
    <copy todir="temp/build">
      <fileset dir="res" excludes="manifest.mf, project.jad, *.png"/>
    </copy>
  </target>
  <target name="replaceres" depends="copyres">
    <replace file="temp/res/manifest.mf" encoding="UTF-8">
      <replacefilter token="@NAME@" value="${app.name}"/>
      <replacefilter token="@VENDOR@" value="${app.vendor}"/>
      <replacefilter token="@MIDLET@" value="${app.midlet}"/>
    </replace>
  </target>
  <target name="pngcrush" depends="replaceres">
    <exec executable="${LIB_PATH}/pngcrush.exe">
      <arg line="-d temp/build temp/res/*.png"/>
    </exec>
  </target>
  <target name="dist" depends="pngcrush">
    <jar jarfile="dist/${app.project}.jar" basedir="temp/build" manifest="temp/res/manifest.mf" manifestencoding="UTF-8"/>
    <taskdef name="filesize" classname="ant.FileSizeTask" classpath="${LIB_PATH}/FileSizeTask.jar"/>
    <filesize file="dist/${app.project}.jar" property="size"/>
    <copy tofile="dist/${app.project}.jad" file="res/project.jad"/>
    <replace dir="dist" includes="${app.project}.jad" encoding="UTF-8">
      <replacefilter token="@NAME@" value="${app.name}"/>
      <replacefilter token="@VENDOR@" value="${app.vendor}"/>
      <replacefilter token="@MIDLET@" value="${app.midlet}"/>
      <replacefilter token="@JAR@" value="${app.project}"/>
      <replacefilter token="@FILESIZE@" value="${size}"/>
      <replacefilter token="@DESCRIPTION@" value="${app.description}"/>
      <replacefilter token="@PRICE@" value="${app.price}"/>
    </replace>
    <!--
      <copy todir="bin">
      <fileset dir="dist" includes="${app.project}.*"/>
      <fileset dir="temp/res" includes="manifest.mf"/>
      </copy>
    -->
  </target>
</project>

每个build.xml文件都包含一个project和至少一个target。target包含任务元素,任务是一段可执行代码,每个任务元素都有一个id属性,以便于在文件中引用。Ant有内置任务集可供使用,如上面文件中用到的property、javac和war,分别完成设置属性、编译和打包任务。当然如果需要的话也可以写自己的任务。

build.xml的根元素是progject,它有三个属性name default basedir,其中default是必需的。name指定工程的名字,basedir表示工程的基路径,设置为"."表示build.xml所在的路径。default表示默认的target,运行ant时如果不指定target,则用default指定的target.

property任务用来设置属性,一个工程可以设置很多属性,属性有名字和值,属性设置后可以在后面引用。

<property name="dist.name" value="struts_demo"/>设置一个名字为dist.name的属性,其值为struts_demo,后面使用时用${dist.name}引用,表示字符串struts_demo.

<property name="src" location="src"/>设置一个名字为src的属性,它的值是一个路径,用location设置。如果location内容以/或\或D:\ C:\之类开始,表示绝对路径,否则表示相对路径,相对于project中设置的basedir.

使用path或classpath可以设置类的路径,后面引用时用id设置的值

构建工程最常用的ant内置任务:

  • mkdir: 创建目录,dir=要创建的目录
  • delete: 删除文件或文件夹 dir=要删除的文件或文件夹
  • javac: 编译java源文件,java源文件放在srcdir指定的文件夹中,生成的.class文件按照 package语句组织目录,存放在destdir指定的文件夹中。要注意源文件的目录组织要与package语句相一致


上面的build.xml例子中,target中的属性depends表示在执行本target之前必须要做的target, 例如dist 的depends=compile,意思是在用dist打包之前必须先用compile编译。这样当执行dist时首先执行compile

运行Ant

使用ant.bat可以直接运行ant,如果不带任何参数,ant会在当前路径下搜索build.xml文件,如果找到,就运行project的default指定的target.也可以带参数来选择build.xml文件和要运行的target

对于上面的例子,假定build.xml所在的目录为D:\struts_demo\ ,则下面三种执行方式效果是一样的:

   1.   cd c:\demo
        ant
   2.   ant -buildfile d:\struts_demo\build.xml
   3.   ant -buildfile d:\struts_demo\build.xml    dist

如果执行ant -buildfile d:\struts_demo\build.xml compile,则执行compile target。

对于熟悉了windows下开发的朋友们,是不是有点麻烦。没关系,别忘了windows也是支持批处理的,熟悉DOS的一定不会忘记autorun.bat。 写个自己的bat文件吧。只有两行就足够了。

call ant
pause

------------------------------补充----------------------

现在build有几种选择,用得最多恐怕还是ANT,当然Maven异军突起。有赶超前辈之势,虽然看资料说Maven多优秀,解决了ANT的问题(但是也带来新的问题),但是,我还是喜欢ANT. 

 

使用ANT一定要写build脚本,就是build.xml。 但是“简单”的脚本也有很多学问。还是在老外的严谨的“治技术”的思想下才认识到的。把我自己体会记录在这里。 

 

下面给出一个例子: 

Build.xml代码  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<project name="project" default="dist" basedir=".">  
  
    <property environment="env" />  
  
    <property name="root" value="." />  
  
    <condition property="isUnix">  
  
        <os family="unix" />  
  
    </condition>   
  
    <condition property="isWindows">  
  
        <os family="windows" />  
  
    </condition>   
  
    <condition property="systempropsfile" value="${basedir}/unixbuild.properties" else="${basedir}/build.properties">  
  
        <os family="unix" />  
  
    </condition>  
  
    <property file="${systempropsfile}"/>     
  
    <path id="build.path">  
  
        <fileset dir="${web.library.dir}">  
  
            <include name="**/*.jar" />  
  
        </fileset>  
  
    </path>        
  
    <target name="init" description="">  
  
        <echo message="####   S T A R T SAMPLE BUILDING   ####" />  
  
        <tstamp />  
  
        <echo message="Started on ${TODAY} at ${TSTAMP}" />  
  
        <echo message="The base directory: ${basedir}" />  
  
        <echo message="Using properties file: ${systempropsfile}" />  
  
    </target>   
  
    <target name="clean" depends="init">  
  
        <delete dir="${dist.dir}/${project.war}" />  
  
        <delete dir="${build.dir}" />  
  
        <mkdir dir="${dist.dir}" />  
  
        <mkdir dir="${build.dir}" />  
  
    </target>       
  
....................  
  
....................    
  
</project>

1. 首先说第一行: 项目名称,这个最好用一个比较有意义的名字。而basedir变量是ANT的默认变量,指build.xml的绝对路径。 当然不写也可以直接使用,但是仍然建议显式的定义一下比较好。 

2. 5~11行是处理不同平台的不同情况。如果脚本里针对不同平台调用不同的其他的脚本,这几行就很有必要了。 

3. 13~16行,还是处理不同平台的情况,但是只针对properties文件,之所以有properties文件,是因为我们在不同平台下必须指定不同的目录。如果我在windows下可以指定c:/dev/project目录做为build目录,而且在linux下就不应该这么指定.所以必须加载不同的properties文件,有时在linux下还要考虑目录权限问题,如果想修改目录,把这些目录变量集中放在一个properties目录里找起来也很方便。 

4. 24~30行,显示一些提示信息,这当然不是必须的,但却是必要的。例如我这里就显示日期和当前使用的properties文件。这些信息对于生成日志和检查错误很有用。 

5. 32~37行,是清除以前产生的文件,在一次build开始一般都有清除的工作要做,所以一般的build里都有这个target.这里面有一个技巧,就是为什么不直接删除目录,还是先删除文件,再删除目录呢?是不是多此一举呢? 不是!因为很有可能这个目录是不能删除的,而文件一般都是可以删除的,你马上是可以产生出来文件。但是目录就不同了,可能有些目录你不可控的情况出现。只要删除文件一般也就够了。 

6. 后面的target就根据自己的需要处理吧,一般没有什么好说的。 

 

下面给出两个properties文件的内容: 

Unixbuild.properties代码  

#########################  

###  Global Settings  ###  

#########################  

  

###  Project base directories  ###  

source.dir=${basedir}/src  

dist.dir=${env.HOME}/project/  

build.dir=${dist.dir}/build/  

web.library.dir=${basedir}/WebContent/WEB-INF/lib  

build.web.library.dir=${build.dir}/WEB-INF/lib   

web.classes.dir=${basedir}/WebContent/WEB-INF/classes  

build.web.classes.dir=${build.dir}/WEB-INF/classes    

web.content.dir=${basedir}/WebContent   

web.info.dir=${basedir}/WebContent/WEB-INF  

build.web.info.dir=${build.dir}/WEB-INF    

build.output.dir=${dist.dir}/out/  

project.war=project.war  

Build.properties代码  

#########################  

###  Global Settings  ###  

#########################  

  

###  Project base directories  ###  

source.dir=${basedir}/src  

dist.dir=c:/dev/project/  

build.dir=${dist.dir}/build/  

web.library.dir=${basedir}/WebContent/WEB-INF/lib  

build.web.library.dir=${build.dir}/WEB-INF/lib   

web.classes.dir=${basedir}/WebContent/WEB-INF/classes  

build.web.classes.dir=${build.dir}/WEB-INF/classes    

web.content.dir=${basedir}/WebContent    

web.info.dir=${basedir}/WebContent/WEB-INF  

build.web.info.dir=${build.dir}/WEB-INF   

build.output.dir=${dist.dir}/out/  

project.war=project.war  

 

 

这两个文件差别就是那7行部分,就是因为上面我提到的目录权限问题,所以linux下的默认目录不要指定到/home下等不能保证用户有权限的目录

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值