1 引言
1.1 背景介绍
1.1.1 什么是Ant
Ant 是一个基于 Java 的构建工具。可以构建、测试与部署Java项目,项目的规模可以从很小到很大。
1.1.2 为什么要用Ant
1.跨平台--因为ant是使用java实现的;
2.使用简单--与ant的兄弟make比起来;
3.语法清晰--同样是和make相比;
4.功能强大--ant能做的事情很多,可能你用了很久,你仍然不知道它能有多少功能。当你自己开发一些ant插件的时候,你会发现它更多的功能。
1.2 写作目的
项目代码在CI上扫描时,有的扫描插件需要对java文件进行编译后扫描,所以需要开发人员提供代码的编译脚本,有的项目由多个工程组成,而且这些工程可能还有特定的编译顺序,用普通的bat或者bash脚本来编译就比较复杂;而ant就可以很方便的对多个工程进行编译打包。
1.3 安装说明
要使用Ant首先需要构建一个Ant环境,步骤如下:
1. 安装jdk
2. 安装Ant :(见附件)
3. 将Ant解压到你想安装Ant的目录
4. 在系统环境变量中添加ANT_HOME,路径为你安装Ant的目录,在PATH下添加ANT_HOME下的bin目录;
5. 测试一下你的设置,开始-->运行-->cmd进入命令行-->键入 ant 回车,如果看到Buildfile: build.xml does not exist!
Build failed
那么恭喜你你已经完成ant的安装
2 详解
2.1 如何用Ant进行编译
2.1.1 什么是build.xml
要运行ant需要有一个build.xml,虽然不一定要叫这个名字,但是这是ant默认的配置文件名。在运行ant时,ant会查找当前目录下的build.xml文件,根据其中的配置来执行相应的动作。
2.1.2 如何编写build.xml
下面给出一个简单的例子用来讲解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?xml version="1.0" encoding="UTF-8"?>
<project name="Liantong_Woyun" default="default"> <description> Local Integrated System Architecture" was build by Huawei Technology Co., Ltd. </description>
<property name="version" value="0.0.1" /> <property name="src" value="src" /> <property name="lib" value="portal\webtenant\ROOT\WEB-INF\lib" /> <property name="dst" value="bin"> </property>
<target name="default" depends="compile" description="description"> </target>
<target name="dst_exist"> <available file="${dst}" type="dir" property="dir_exist"> </available> </target>
<target name="mkdir_dst" depends="clean" unless="dir_exist"> <mkdir dir="${dst}" /> </target>
<target name="compile" depends="mkdir_dst" description="description"> <javac srcdir="${src}" destdir="${dst}" debug="on" includeAntRuntime="false" encoding="UTF-8"> <classpath> <fileset dir="${lib}"></fileset> </classpath> </javac> </target>
<target name="clean" description="description"> <delete dir="${dst}"></delete> </target>
</project> |
|
|
下面先简单介绍一下的build.xml的常见元素:
2.1.2.1 Project元素
project是配置文件的根元素,里面配置了这个ant工程的工程名name和默认执行任务default。
name:用于指定project元素的名称。
default:用于默认执行时所执行的target名称
basedir:用于指定基路径的位置,这个属性没有指定时,使用build.xml的父目录作为基准目录。
2.1.2.2 description元素
description用于说明当前ant工程的(理解为注释就好了)。
2.1.2.3 property元素
property元素可看做常量或者是参数的定义,project的属性可以通过property元素来设定,也可以在ant之外通过properties文件设定。
2.1.2.4 target元素
它是ant的执行单元,可以包含一个或多个任务,多个target可以相互依赖;
name:target元素的名称,在同一个project元素中不能重复,可以通过指定的target-name运行某个target;
depends属性:用于描述target之间的依赖关系,若与多个target存在的依赖关系时,需要以“,”间隔。ant会依照depends属性中的target出现的顺序依次执行每个target。被依赖的target会先执行。例如:有三个targetABC,依赖关系为:A depends B,B depends C,那么执行顺序为C>B>A。
if属性:用于验证指定的属性是否存在,若不存在,所在的target将不会被执行。
unless属性: 它也用于验证指定的属性是否存在,如果不存在,所在的target则执行。
description属性:该属性是target功能的简短描述和说明。
2.1.2.5 例子详解
了解这些元素之后,我们再来看之前的那个例子,Ant的执行顺序就很清楚了在案例的配置文件中,project元素的default元素设置了默认任务为名为default的target。
1.Ant开始执行时,调用默认target,发现depends属性指向compile;
2.调用compile,发现depends属性指向mkdir_dst,mkdir_dst的depends属性指向clean;
3.执行clean任务,删除指定目录;
4.执行mkdir_dst任务,通过unless判断,如果当属性没有设置时才执行创建文件夹;
5.执行compile任务,用classpath指定编译依赖的文件位置,javac 元素的属性srcdir和destdir分别指定了编译的源码目录和目标目录。调用javac对java文件进行编译;
6.执行完成。
2.1.3 Ant的常用任务
刚才介绍了target是ant配置中的任务单元,下面介绍一下可以在target下设置的常用任务。
2.1.3.6 copy任务
该任务主要用来对文件和目录的复制功能。举例如下:
例1:
复制单个文件:<copy file="file.txt" tofile="copy.txt"/>
例2:
对文件目录进行复制:
<copy todir="../newdir/dest_dir">
<fileset dir="src_dir"/>
</copy>
例3:
将文件复制到另外的目录:
<copy file="file.txt" todir="../other/dir"/>
2.1.3.7 delete任务
对文件或目录进行删除,举例如下:
例1:
删除某个文件:<delete file="photo/amigo.jpg"/>
例2:
删除某个目录:<delete dir="photo"/>
例3:
删除所有的备份目录或空目录:
<delete includeEmptyDirs="true">
<fileset dir="." includes="**/*.bak"/>
</delete>
2.1.3.8 mkdir任务
创建目录。
例如:
<mkdir dir="build"/>
2.1.3.9 move任务
移动文件或目录,举例如下:
例1:
移动单个文件:<move file="fromfile" tofile=”tofile”/>
例2:
移动单个文件到另一个目录:<move file="fromfile" todir=”movedir”/>
例3:
移动某个目录到另一个目录:
<move todir="newdir">
<fileset dir="olddir"/>
</move>
2.1.3.10 antcall任务
target 调用,用于执行同一个配置文件内的其他target 。
例如:<antcall target="compile"/>
2.1.3.11 ant任务
用于调用其他ant项目。通过antfile属性指定其他脚本,dir属性指定脚本路径,甚至可以用过target属性指定执行目标ant项目中的特定任务
例如:
<target name="build_logger_jar" depends="mkdir_dst" description="description">
<ant antfile="another_build.xml" dir="${logger_dir}" inheritall="false" inheritrefs="false">
</ant>
</target>
2.1.4 Ant的编译任务
2.1.4.12 利用Ant的javac任务来编译java程序
Ant的javac任务用于实现编译Java程序的功能。下面来看一个简单的例子:
首先我们建立名为一个src目录为源代码目录,在src目录下建立HelloWorld.java这个类文件。该类文件的内容如下:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello,TelcoOS");
}
}
同时在src目录的同级下建立build.xml文件,在该文件中编译src目录下的java文件,并将编译后的class文件放入build/classes目录中,在编译前,需清除classes目录,该文件的内容如下:
<?xml version="1.0"?>
<project name="javacTest"default="compile" basedir=".">
<target name="clean">
<delete dir="build"/>
</target>
<target name="compile" depends="clean">
<mkdir dir="build/classes"/>
<javac srcdir="src" destdir="build/classes"/>
</target>
</project>
运行该build.xml文件,可在工程中看到新增了build/classes目录,并在该目录中生成了编译后的HelloWorld.class文件。
2.1.4.13 使用Ant的jar任务生成jar文件
jar任务用于将编译好的class文件打成jar包
例如:
<target name="build" depends="compile" description="description">
<jar jarfile="${package}" basedir="${dst}">
</jar>
</target>
2.1.4.14 使用Ant的war任务打包J2EE Web项目
war任务的使用方法和jar 类似,
例如:
<target name="war" depends="compile">
<war destfile="${build}/hello.war" webxml="WebRoot/WEB-INF/web.xml">
<fileset dir="WebRoot" includes="**/*.jsp"/>
<!-- lib目录下的jar包-->
<lib dir="${lib}"/>
<!—编译后的的class文件-->
<classesdir="${classes}"/>
</war>
3 总结
本文详细描述了Ant的安装与配置、关键元素和常用任务。并通过实例讲述了Ant在我们Java项目中的应用,讲述了编译、运行java程序,以及打jar包、war包等知识。
我们可以看到,Ant在自动构建和部署Java程序方面方便易用,而且非常灵活,是很实用的工具。