Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

搭建Ant开发环境

From 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 05:16.
151 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×