今天在使用eclipse集成了的Ant工具build时,发生错误:
BUILD FAILED
/workspace/xxx/build.xml:49: Cannot find /workspace/xxx/C:/android-sdk-windows/tools/ant/build.xml imported from /workspace/xxx/build.xml
因为以前没怎么用过这,也不知道到底错在哪里了;查看了下工程的build.xml文件,感觉没有错阿,自己sdk/tools/ant下也存在build.xml文件阿;
后来才在自己的工程下的project.properties文件下发现了错误所在;原来是我sdk的路径写错了。。。
既然开始使用ant了,我就想着先了解学习学习下这个工具吧!
1. 什么是Ant
Ant是一个基于Java的生成工具;在软件开发中用来将源代码和其他输入文件生成可执行文件;实现项目的自动构建和部署,确保每次的生成版本一致。
2. Ant的安装
一般Eclipse,MyEclipse等都已经给我们预先集成好了Ant,不需要我们生动安装;
当然你也可以选择自己安装;一般就是自己去下载个Apache Ant, 解压,然后添加系统环境变量:ANT_HOME,该变量指向Ant解压后的根目录;
为了能让系统自动找到Ant 需要在系统环境变量path中添加Ant的bin目录;
完成后在命令行输入Ant就可以用啦~
3. Ant的关键元素
Ant的构建是基于XML编写的,默认名称为build.xml;
构建文件包括元素,以及其中嵌套的、 和 元素。
1)project元素
project元素是Ant构建文件的根元素,每个构建文件至少包含一个project元素;在每个project元素下可包含多个target元素
接下来看看project元素的各个属性:
name:用于指定project的名称
default:用于指定执行project默认执行时所执行的target名称
basedir:用于指定基路经的位置;该属性可以被basedir property覆盖。当覆盖时,该属性被忽略。如果属性和basedir property都没有设定,就使用buildfile文件的父目录。
2)target元素
它为Ant的基本执行单元,可以包含一个或多个具体任务;多个target可以存在相互依赖关系
接下来看看target元素的各个属性:
name:指定target元素的名称,这个属性在一个project元素中是唯一的
depends:用于描述target之间的依赖关系;若与多个target存在依赖关系时以“,”间隔;Ant会依据depends中target出现的先后顺序进行执行,被依赖的target先执行
if:用于验证指定的属性是否存在,若不存在,所在的target将不会被执行
unless:与if功能恰好相反,也用于验证指定的属性是否存在,若不存在,则target会被执行
description:对target功能的简单描述和说明
3)property元素
该元素可看作参量或者参数的定义,project的属性可以通过property元素来设定,也可在Ant之外设定。若要在外部引入某文件,例如build.properties文件,可以通过如下内容将其引入:
property元素可用作task的属性值。在task中是通过将属性名放在“${”和“}”之间,并放在task属性值的位置来实现的。
Ant提供了一些内置的属性,它能得到的系统属性的列表与Java文档中System.getPropertis()方法得到的属性一致,这些系统属性可参考sun网站的说明。
同时,Ant还提供了一些它自己的内置属性,如下:
basedir:project基目录的绝对路径,该属性在讲解project元素时有详细说明,不再赘述;
ant.file:buildfile的绝对路径,如上面的各例子中,ant.file的值为E:"build.xml;
ant.version:Ant的版本,在本文中,值为1.7.0;
ant.project.name:当前指定的project的名字,即前文说到的project的name属性的值;
ant.java.version
:Ant
检测到的JDK
的版本
4. Java相关
1)Javac
编译java原代码
例子
1.destdir="{build}"
classpath="xyz.jar"
debug="on"
/>
编译{src}目录及其子目录下的所有。Java文件,。Class文件将放在{build}指定的目录下,classpath表示需要用到的类文件或者目录,debug设置为on表示输出debug信息
2)destdir="{build}"
includes="mypackage/p1/**,mypackage/p2/**"
excludes="mypackage/p1/testpackage/**"
classpath="xyz.jar"
debug="on"
/>
编译{src}和{src2}目录及其子目录下的所有。Java文件,但是package/p1/**,mypackage/p2/**将被编译,而mypackage/p1/testpackage/**将不会被编译。Class文件将放在{build}指定的目录下,classpath表示需要用到的类文件或者目录,debug设置为on表示输出debug信息
3)
destdir="{src}"
classpath="{classpath}"
debug="on"
/>
路径是在property中定义的
4)打包相关
jar
将一组文件打包
例子:
1.
将{build}/classes下面的所有文件打包到{dist}/lib/app.jar中
2.basedir="{build}/classes"
includes="mypackage/test/**"
excludes="**/Test.class"
/>
将{build}/classes下面的所有文件打包到{dist}/lib/app.jar中,但是包括mypackage/test/所有文件不包括所有的Test.class
3.basedir="{build}/classes"
includes="mypackage/test/**"
excludes="**/Test.class"
manifest="my.mf"
/>
manifest属性指定自己的META-INF/MANIFEST.MF文件,而不是由系统生成
##
我eclipse运行提示错误:
Dx 1 error; aborting
Conversion to Dalvik format failed with error 1
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Exception parsing classes
看提示详情是某文件的路径不匹配。。但是我有好多jar文件,根本不知道那个class在哪个里面。。。。
然后捣腾了一下午还没有解决。。。好忧桑