×
Namespaces

Variants
Actions

搭建Ant开发环境

From Nokia Developer Wiki
Jump to: navigation, search
WP Metro Icon Chinese.png
Article Metadata

文章
max.chen 在 29 Aug 2010 创建
最后由 hamishwillee 在 15 Dec 2011 编辑

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

Contents

版本


安装JDK

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

Cn ant dev 1.png.png


安装成功后,必须要设置环境变量,这和使用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的例子:

<?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

简单吧。 用Ant开发的优势在于速度快,而且一切尽在掌握。

相关链接

This page was last modified on 15 December 2011, at 08:16.
146 page views in the last 30 days.