如何使用ANT在命令行进行编译和测试

如何使用ANT在命令行进行编译和测试,第1张

一、环境变量

在网上找到ANT的压缩包,解压缩以后放到C盘根目录如下图

对,就是这个鬼样子,放在这里就可以用了,不用安装之类的

环境变量如下图:

你要定义ANT_HOME,然后让系统path找到这个ANT_HOME就行了

二、写build.xml

你的目录结构如下图:

文件 放在src

引用的jar包放在lib

编译结果安排在classes

接下来就是build.xml了

如下,自己看吧

[html] view plain copy

<?xml version="1.0"?>

<project name="pojo_0428" default="prepare" basedir=".">

<property name="source.root" value="src"/>

<property name="class.root" value="classes"/>

<property name="lib.dir" value="lib"/>

<!-- class path for compilation and execution -->

<path id="basepath">

<!-- 运行时 class文件的位置 -->

<pathelement location="${class.root}" />

<!-- jar包 -->

<fileset dir="${lib.dir}">

<include name="*.jar"/>

</fileset>

</path>

<!--默认的target -->

<target name="prepare">

<delete dir="${class.root}"/>

<mkdir dir="${class.root}"/>

</target>

<!--编译 -->

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

<javac srcdir="${source.root}"

destdir="${class.root}"

debug="on"

optimize="off"

deprecation="on">

<classpath refid="basepath"/>

</javac>

</target>

<!--执行。 案例程序的入口 依赖 compile -->

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

<java classname="com.javathink.Student" fork="true">

<classpath refid="basepath"/>

</java>

</target>

</project>

首先我们来看看如何使用ant脚本打出一个jar包 我们新建一个工程AntExportJar 在工程的目录下面新建一个build.xml,这个是ant脚本规定的一个入口脚本文件,文件名都是:build.xml [html] view plain copy?

<?xml version ="1.0" encoding ="UTF-8" ?>

<project name ="AntExportJar" basedir ="." default ="exportJar" >

????<!--?设置全局变量?-->

????<property name ="src" value ="src" />

????<property name ="dist" value ="dist" />

????<property name ="app.name" value ="ant" />

????<property name ="app.version" value ="1.0" />

????<property name ="classes.encode" value ="GBK" />

????<property name ="lib" value ="libs" />

????<property

????????name ="project-dir"

????????value ="C:\Users\i\workspace\AntExportJar" />

????<property

????????name ="sdk-folder"

????????value ="C:\Users\i\AppData\Local\Android\sdk" />

????<property

????????name ="platform-folder"

????????value ="${sdk-folder}\platforms\android-22" />

????<property

????????name ="android-jar"

????????value ="${platform-folder}\android.jar" />

????<property

????????name ="src"

????????value ="${project-dir}\src" />

????<property

????????name ="bin"

????????value ="${project-dir}\bin" />

????<property

????????name ="libs"

????????value ="${project-dir}\lib" />

????<!--?task?-->

????<target name ="init" >

????????<echo>

????????????Initialize...

????????</echo>

????????<delete dir ="${bin}" />

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

????</target>

????<target name ="buildFiles" depends ="init" >

????????<javac

????????????????bootclasspath ="${android-jar}"

????????????????compiler ="javac1.7"

????????????????target ="1.7"

????????????????destdir ="${bin}"

????????????????encoding ="GBK"

????????????????includeAntRuntime ="true"

????????????????listfiles ="true" >

????????????????<src path ="${project-dir}" />

????????????????<classpath>

?????????????????????<!--?引用第三方jar包需要引用,用于辅助编译,并没有将jar打包进去。jar的打包在dex命令中。-->

?????????????????????<fileset dir ="${libs}" includes ="*.jar" />

????????????????</classpath>

????????</javac>

????</target>

????<!--?导出jar文件?-->

????<target name ="exportJar" depends ="buildFiles" >

????????<delete dir ="${dist}" />

????????<!--?Create?the?distribution?directory?-->

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

????????<!--?Put?everything?in?${classes}?into?the?MyProject-${DSTAMP}.jar?file?-->

????????<jar jarfile ="${dist}/${app.name}.jar" basedir ="${bin}" >

????????????<!--

????????????<fileset?dir="${libs}"?includes="**/*.jar"?/>

????????????-->

????????????<zipfileset excludes ="META-INF/*.SF" src ="${libs}/Baidu_NativeAd_SDK.jar" />

????????????<zipfileset excludes ="META-INF/*.SF" src ="${libs}/gdt_mob_release.jar" />

????????</jar>

????</target>

</project>

脚本很简单,下面我们就来分析一下: [html] view plain copy?

<project name ="AntExportJar" basedir ="." default ="exportJar" >

最外围的一个标签是project,是一个工程标签,有名字,还有就是工程的目录baseDir,用点号:"." 接下来就是定义全局变量,或者是属性值: [html] view plain copy?

<!--?设置全局变量?-->

<property name ="src" value ="src" />

<property name ="dist" value ="dist" />

<property name ="app.name" value ="ant" />

<property name ="app.version" value ="1.0" />

<property name ="classes.encode" value ="GBK" />

<property name ="lib" value ="libs" />

<property

????name ="project-dir"

????value ="C:\Users\i\workspace\AntExportJar" />

<property

????name ="sdk-folder"

????value ="C:\Users\i\AppData\Local\Android\sdk" />

<property

????name ="platform-folder"

????value ="${sdk-folder}\platforms\android-22" />

<property

????name ="android-jar"

????value ="${platform-folder}\android.jar" />

<property

????name ="src"

????value ="${project-dir}\src" />

<property

????name ="bin"

????value ="${project-dir}\bin" />

<property

????name ="libs"

????value ="${project-dir}\lib" />

这样我们在后面就可以使用:${name值} 来使用value值的定义了,所以这里就相当于定义了变量的作用,这里我们看到有一些value值是路径,但是这里我们感觉有一个不好的地方,就是这些路径是写死的,那么我们还可以怎么做能让他变得灵活呢?其实很简单,ant脚本中是可以访问环境变量的,那么我们只要将这些路径定义成环境变量就可以了: [html] view plain copy?

<property environment ="env" />

<property name ="ANDROID_HOME" value ="${env.ANDROID_HOME}" />

第一行先申明一个环境变量值,这个env是公共的写法,也是ant自带的,他表示当前的环境变量的值,那么后面就可以访问具体的哪些环境变量了,比如这里我配置了ANDROID_HOME这个环境变量,那么就可以用${env.ANDROID_HOME}来访问androidsdk的目录了,和上面的那个直接使用绝对路径的方式是一样的。 解析来就是定义task了,在ant中task也是最重要的,我们最终运行的都是task,就相当于Java中的main方法一样。ant脚本中可以定义多个task,而且每个task可以有执行的先后顺序的。相当于Java中的方法中调用其他方法一样。 [html] view plain copy?

<!--?task?-->

<target name ="init" >

????<echo>

????????Initialize...

????</echo>

????<delete dir ="${bin}" />

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

</target>

首先这里定义了一个初始化的task,其中echo标签也是很常用的,就是打印信息的,然后是删除目录${bin},这个bin变量在上面已经定义了,然后在创建${bin}目录。 初始化完之后,开始执行编译工作: [html] view plain copy?

<target name ="buildFiles" depends ="init" >

????<javac

????????bootclasspath ="${android-jar}"

????????compiler ="javac1.7"

????????target ="1.7"

????????destdir ="${bin}"

????????encoding ="GBK"

????????includeAntRuntime ="true"

????????listfiles ="true" >

????????<src path ="${project-dir}" />

????????????<classpath>

????????????????<!--?引用第三方jar包需要引用,用于辅助编译,并没有将jar打包进去。jar的打包在dex命令中。-->

????????????????<fileset dir ="${libs}" includes ="*.jar" />

????????????</classpath>

????</javac>

</target>

这里在此定义一个buildFiles的task,depends的值是表示当前的task在这个depends的task执行完之后在执行,这里就是先执行init的task,然后在执行buildFiles的task,这里的task主要是编译Java成class文件: bootclasspath:表示编译依赖的系统库,这里依赖的是android.jar compiler:表示编译的java版本 target:表示编译之后的class的版本,就是能够运行的java版本 destDir:表示编译之后的class文件的存放目录 其他的就不说了,这里还有一个重点,也就是我们在编译的时候会遇到的问题,就是我们在编译的时候,会引用到第三发的jar,所以这里我们为了保证能够编译过,这里还必须用classpath标签来引用这些jar,当然这里只是能够保证编译通过,并不会把这些jar也编译到最终我们想要的jar中,这个问题我们后面再说。 下面在看最后的一个task,就是将编译完之后的class文件打包成jar文件: [html] view plain copy?

<!--?导出jar文件?-->

<target name ="exportJar" depends ="buildFiles" >

????<delete dir ="${dist}" />

????<!--?Create?the?distribution?directory?-->

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

????<!--?Put?everything?in?${classes}?into?the?MyProject-${DSTAMP}.jar?file?-->

????<jar jarfile ="${dist}/${app.name}.jar" basedir ="${bin}" >

????????<!--

????????<fileset?dir="${libs}"?includes="**/*.jar"?/>

????????-->

????<zipfileset excludes ="META-INF/*.SF" src ="${libs}/Baidu_NativeAd_SDK.jar" />

????<zipfileset excludes ="META-INF/*.SF" src ="${libs}/gdt_mob_release.jar" />

????</jar>

</target>

这里我们定义了一个exportJar的task,他是在buildFiles的task运行完之后在运行。 首先删除目标目录${dist},然后在创建一个目录。这个目录就是存放最后编译好的jar文件的目录 然后就是用jar标签来导出jar文件了: jarfile:表示编译完之后存放的jar文件名路径 basedir:表示需要编译jar的class文件目录 其他就OK了,但是在实际中我们在编译的过程中会引用到第三方的jar,那么这时候我们把这些jar编译到最终的jar中,说道这里,其实我们在使用Eclipse导出jar的时候,有一个插件可以做到这点:fat-jar,安装完插件

ant是apache项目组的一个子项目,是一个基于java的构建工具。ant本身用java实现,要构建的工程的配置文件用xml格式描述,可以很方便的实现跨平台构建工作。

ant 可以从http://ant.apache.org下载,目前最新版本为1.5.4。下载完毕后直接解压缩到一个目录,例如D:\ant。

下一步我们需要设置如下的环境变量:

ANT_HOME:ant的安装目录,如果按上面方法解压缩了ant,那么这个值应该设为D:\ant

JAVA_HOME:jdk的安装目录

PATH:把%ANT_HOME%\bin目录加到path变量,以便于从命令行直接运行ant。

(1)建立build.xml

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

下面是一个最简单的build.xml文件:

<?xml version="1.0" encoding="ISO-8859-1"?>

<project name="projectTemplate" default="init" basedir=".">

<target name="init" >

<property name="lib.dir" value="lib"/>

<echo message="Hello ,lib.dir is set to ${lib.dir}" >

</echo>

</target>

</project>

每个build.xml有且仅有一个project,每个project下面可以包含多个target,每个target表示一个小的任务,每个任务负责执行一段脚本。ant有内置任务集可供使用,例如上面的echo就是在console上显示消息。

更详细的内置任务请参考http://ant.apache.org/manual/coretasklist.html

${lib.dir}表示引用一个名字叫做lib.dir的属性值,这个属性的值就是lib。

(2)运行ant

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

ant -buildfile c:\demo\build.xml init

表示运行c:\demo\build.xml 中名字为init的target

(3)ant的目标依赖

target有一个属性depends,在其中可以指定一系列的target名字,表示在执行该target前,必须首先执行的一系列其它target。depends具有传递性,例如:targetA depends targetB,而targetB depends targetC和targetD,这样在执行targetA之前,首先执行C和D,然后执行B,最后才会执行A。

下面是个简单的例子,在执行编译的动作前,首先需要建立一个目标代码存放的目录,然后再执行编译。

<?xml version="1.0" encoding="ISO-8859-1"?>

<project name="project" default="init" basedir=".">

<target name="init" >

<property name="dist" value="dist"/>

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

</target>

<target name="build" depends="init">

<javac srcdir="SourceCode" destdir="${dist}">

</javac>

</target>

</project>


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8899862.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存