Ant脚本简介与基础知识

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6624003.html 

    一:Ant是什么

    Ant相当于Linux环境下的shell脚本,只不过是用xml文档来编写的。我们知道,在linux环境中,可以通过编写shell脚本,封装一系列繁琐而日常需要经常重复的操作。在需要进行这些操作时,只需运行这个脚本就可以批处理这些操作了。Ant脚本也是一样,只不过它一般是为了方便Java项目的编译、运行、测试、打包等工作服务的。

    我们知道,日常开发工作中,一个项目除了编码外,还需单元测试、集成测试、系统测试,测试过程中可能会不断修改代码,然后再测试。这样重复而繁琐的过程是十分耗时间的。在程序编译、测试通过后,还需要打包导出,如果之后需要改变了代码,那么这些工作又要重新再做。Ant的产生,就是为了把我们从这些重复而琐碎的工作中解放出来。

    二:Ant能干什么

    Ant脚本,通过一个xml文件来制定一系列文件的创建删除任务、编译任务、运行任务、测试任务、打包任务等。我们可以通过ant指令执行这个xml脚本,来批处理这些任务,这样就可以实现“一键”完成编码后的编译、运行、测试、打包导出等工作,使我们可以更加专注于代码的编写与质量。

    三:Ant的使用

    1:安装配置

    下载地址:http://ant.apache.org/

    安装:解压得到 apache-ant文件夹,这个就是Ant的安装目录了,复制到你想安置的地方即可。

    配置:与设置Java运行环境类型:在系统环境变量中添加:ANT_HOME= XX:\XX\apache-ant  (apache-ant所在路径)

                                             在Path环境变量值后面加上:XX:\XX\apache-ant\bin (apache-ant\bin所在路径)

    打开cmd,输入 ant ,如果出现以下结果则说明Ant配置成功:

 

    2:编写Ant脚本

    一个Ant脚本即可完成至少一个项目的编译、运行、测试、打包等工作。Ant脚本同一命名:build.xml

    脚本内容:

         1)project 节点:一个脚本相当于一个project,用一个project来统领脚本中的众多操作命令。用这个project对象来指向脚本本身的基本属性

         project 元素是 Ant 构件文件的根元素, Ant 构件文件至少应该包含一个 project 元素,否则会发生错误。

        ● name 属性:用于指定 project 元素的名称。

        ● default 属性:用于指定 project 默认执行时所执行的 target 的名称。

        ● basedir 属性:用于指定基路径的位置。该属性没有指定时,使用 build.xml的目录作为基准目录。

       2)property节点:属性节点,相当于Ant脚本中的变量,通过属性值来携带具体内容。在每个任务中通过 ${属性名} 访问其属性值,从而获取内容。

       Ant 提供了一些内置的属性,它能得到的系统属性的列表与 Java 文档中 System.getProperties() 方法得到的属性一致。Ant 还提供了一些它自己的内置属性:

      basedir: project 基目录的绝对路径; 

      ant.file: buildfile的绝对路径;

      ant.version: Ant 的版本信息;

      ant.project.name: 当前指定的project的名字;

      ant.java.version: Ant 检测到的JDK版本 。

        3)target节点:任务节点。一个target可以制定一个或内嵌更多任务。

        target为ant的基本执行单元,它可以包含一个或多个具体的单元/任务。多个target 可以存在相互依赖关系,target的执行顺序可以有两种方式控制:一种是依赖,depends属性,AdependsB,则B先执行;另一种就是内嵌:在target A中通过 <ant target="B">命令执行B任务。  

       ● name 属性:指定 target 元素的名称,这个属性在一个 project 元素中是唯一的。我们可以通过指定 target 元素的名称来指定某个 target 。

       ● depends 属性:用于描述 target 之间的依赖关系,Ant 会依照 depends 属性中 target 出现的顺序依次执行每个 target ,被依赖的target 会先执行。

       ● if 属性:用于验证指定的属性是存在,若存在,所在 target 才会被执行。

       ● unless 属性:该属性的功能与 if 属性的功能正好相反,若不存在,所在 target 将会被执行。

       ● description 属性:该属性是关于 target 功能的简短描述和说明。 

    4)copy命令

    copy主要用来对文件和目录的复制功能。

    5)delete命令 

    对文件或目录进行删除。

    6) mkdir 命令

    创建目录。

    7)move 命令

    移动文件或目录,

    8)echo 命令

    在控制台输出信息。它包括 message 、 file 、 append 和 level 四个属性。

    9)jar 命令标签:打包成jar包并导出

     ● destfile:打包导出的JAR路径名,即:导出jar包到哪里。

     ● basedir:被打包的文件,一般是编译通过的文件。

     ● includes表示被归档的文件类型。

     ● exchudes表示被排除的文件类型。

     ● compress表示是否压缩。

    (打包命令标签还有war、tgz,解压包命令uzip)

    10)javac 命令标签:编译标签

    该标签用于编译一个或一组java文件。

    ● srcdir表示源程序的目录。

    ● destdir表示class文件的输出目录。

    ● include表示被编译的文件的模式。

    ● excludes表示被排除的文件的模式。

    ● classpath表示所使用的类路径。

    ● debug表示包含的调试信息。

    ● optimize表示是否使用优化。

    ● verbose 表示提供详细的输出信息。

    ● fileonerror表示当碰到错误就自动停止。 

    11)java 命令标签:运行标签

    该标签用来执行编译生成的.class文件。

    ● classname 表示将执行的类名。

    ● jar表示包含该类的JAR文件名。

    ● classpath所表示用到的类路径。

    ● fork表示在一个新的虚拟机中运行该类。

    ● failonerror表示当出现错误时自动停止。

    ● output 表示输出文件。

    ● append表示追加或者覆盖默认文件。

    12)arg 参数标签:可以用于定义测试用例,向运行程序进行输入,观察输出

    通过<arg>元素向其传递命令行参数。

   ● values 是一个命令参数。

    ● file 表示一个参数的文件名。

    ● line 表示用空格分隔的多个参数列表。

    ● pathref 引用的path(使用path元素节点定义path)的id

    ● prefix 前缀

    ● suffix 后缀 

    13)path节点:表示一个路径

    path元素用来表示一个类路径,不过它还可以用于表示其他的路径。

    ● location 表示一个文件或目录。Ant在内部将此扩展为一个绝对路径。

    ● refid 是对当前构建文件中某处定义的一个path的引用。

    ● path表示一个文件或路径名列表。

 

   3:脚本基本结构解析

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

<!--创建project-->
<project default="默认执行的target" basedir=".">

    <!--创建属性标签:携带数据,在下面的target中使用-->
    <property name="XX"  XX="xx" />
        
    <!--创建任务-->
    <target name="任务名" depends="依赖哪个任务">
                <命令标签  属性=“属性值:指明命令执行的具体内容”/>
    </target>
</project>

    4:执行脚本

   ant:在当前目录下的build.xml运行Ant,执行默认的target。
   ant -buildfile build-test.xml:在当前目录下的build-test.xml运行Ant,执行默认的target。
   ant -buildfile build-test.xml targetName:在当前目录下的build-test.xml运行Ant,根据任务名执行一个target。

   ant -buildfile build-test.xml -D属性=属性值 targetName:在当前目录下的build-test.xml运行Ant,根据任务名执行一个target并指定其某属性为某值。


在Eclipse下使用ant

目前的Eclipse都集成了ant,但是如何在Eclipse下使用ant呢?

1.新建Java Project-新建Java文件HelloWorld.java

HelloWorld.java:

package example;
public class HelloWorld {
    public static void main(String[] args) {
       System.out.println("Hello World");
    }
}

2.在工程根目录下新建build.xml

build.xml:

<?xml version="1.0" encoding="utf-8"?>
<project default="main" basedir=".">
    <target name="main" depends="compile, compress" description="Main target">
       <echo>Building the .jar file.</echo>
    </target>
    <target name="compile" description="Compilation target">
       <javac srcdir="${basedir}/src/example" />
    </target>
    <target name="compress" description="Compression target">
       <jar jarfile="HelloWorld.jar" basedir="${basedir}/src/example"includes="*.class" />
    </target>
</project>

此脚本文件内容是编译/src/example下的java文件,并就地生成class文件,将这个class文件打成jar包,HelloWorld.jar。

此时工程的目录结构如下图所示:

右键选中HelloAnt工程,选择Properties:

选择Builders-New…,选择Ant Build,

Name:Ant_Builder;

Buildfile:${workspace_loc:/HelloAnt/build.xml};

Base Directory:${workspace_loc:/HelloAnt};

(按“Browse Workspace”选择工程根目录)

 

在Builder面板中钩上Ant_Build,去掉Java Builder,即可编译执行。

每次编译时,右键build.xml,选择Run As-Ant Build:

编译结果:

Buildfile: F:\workfile\ant_test\build.xml
compile:
    [javac] F:\workfile\ant_test\build.xml:7: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
compress:
main:
     [echo] Building the .jar file.
BUILD SUCCESSFUL
Total time: 1 second


<?xml version="1.0" encoding="UTF-8"?>
<project default='main' basedir=".">
	<target name = "main" depends="compile, compress" description="Main target">
		<echo>build now</echo>
	</target>
	
	<property name="clean_dir" value="./test_hello.jar" />
		
	<target name="clean">
		<delete dir="${clean_dir}" />	
		<echo>clean</echo>	
	</target>
	
	<target name="mkdir" depends="clean">
		<mkdir dir="${basedir}/jar" />
		<mkdir dir="${basedir}/class" />
	</target>
	
	<target name="compile" depends="mkdir">
		<javac srcdir="${basedir}/src/test"  destdir="${basedir}/class" />
		<echo>compile</echo>
	</target>
	
	<target name = "compress" >
		<jar basedir="${basedir}/src/test" destfile="${basedir}/jar/test_hello.jar"/>
		<echo>compress</echo>
	</target>
</project>