一:什么是ant?
Ant就是一个构建工具,简单点来说,ant就是帮助我们编译,打包java文件的一个程序脚本。
构建:形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个。
二:使用ant的好处:
当我们把开发好的java程序放入服务器(比如linux)上运行,如果不使用ant,那么我们首先需要手动编译(javac)他们,然后打成jar包,在放到指定位置运行。但是考虑一下如果你有成百上千个类,在多次调试,部署的时候,一次次的javac 、copy、jar、 java那将是一份辛苦的工作。而对于c语言(c++)来说,他们有平台自带的make脚本来帮助这些工作的批量完成。但是由于java是跨平台的,所以我们不可能使用平台自带一些脚本程序来帮助我们完成这些重复工作。所以我们需要使用ant。相对于make来说,ant语法清晰,使用简单,并且由于ant是基于java实现的,所以ant也是跨平台的。
三:使用方法:
1.配置环境变量:ANT-HOME(ant安装目录)和PATH(安装目录的bin目录),配置完成后,进入命令行-->键入 ant 回车,如果看到 Buildfile: build.xml does not exist! Build failed 那么恭喜你你已经完成ant的设置。
2.编写ant脚本(缺省叫build.xml)。
3.在命令行中切换到构建文件的目录,输入Ant命令就可以运行Ant.若没有指定任何参数,Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为构建文件。如果使用了 –find 选项,Ant 就会在上级目录中找构建文件,直至到达文件系统得跟目录。如果构建文件的名字不是build.xml ,则Ant运行的时候就可以使用 –buildfile file ,这里file 指定了要使用的构建文件的名称,示例如下:Ant
如下说明了表示当前目录的构建文件为build.xml 运行 ant 执行默认的目标。
4.当开始一个新的项目时,首先应该编写Ant构建文件。构建文件定义了构建过程,并被团队开发中每个人使用。Ant构建文件默认命名为build.xml,也可以取其他的名字。只不过在运行的时候把这个命名当作参数传给Ant。构建文件可以放在任何的位置。一般做法是放在项目顶层目录中,这样可以保持项目的简洁和清晰。下面是一个典型的项目层次结构。
(1) src存放文件。
(2) class存放编译后的文件。
(3) lib存放第三方JAR包。
(4) dist存放打包,发布以后的代码。
以下为简单的build.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!-- default表示默认的运行目标,这个属性是必须的。 basedir表示项目的基准目录。-->
<project name="HelloWorld" default="run" basedir=".">
<!-- property标签相当于生成一个变量,name为变量名,value(或者location)为默认值。取值用${name} -->
<property name="src" value="src"/>
<property name="build.dir" location="${basedir}/build" />
<property name="dest" location="${build.dir}/classes" />
<property name="hello_jar" location="${build.dir}/hello1.jar"/>
<target name="init">
<mkdir dir="${build.dir}"/>
<mkdir dir="${dest}"/>
</target>
<!-- depends是依赖于 -->
<target name="compile" depends="init">
<!--javac标签是进行类的编译命令,其中srcdir为源文件夹 destdir为目标文件夹 -->
<javac srcdir="${src}" destdir="${dest}"/>
</target>
<!--jar标签是进行打包命令 ,其中jarfile是包名,basedir是将打好的包放到哪。注意:与之前的destdir不同 -->
<target name="build" depends="compile">
<jar jarfile="${hello_jar}" basedir="${dest}"/>
</target>
<!-- java标签是运行命令,其中classname是要运行的calsses文件的名称,classpath是运行的文件路径 -->
<target name="run" depends="build">
<java classname="com.test.ant.HelloWorld" classpath="${hello_jar}"/>
</target>
<!-- delete标签是删除文件 -->
<target name="clean">
<delete dir="${build.dir}" />
<delete file="${hello_jar}" />
</target>
<target name="rerun" depends="clean,run">
<ant target="clean" />
<ant target="run" />
</target>
</project>
build2 .xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- ======================================================================
2010-11-11 下午05:54:40
Cseekb
Product Back End Deploy
i-flower
====================================================================== -->
<project name="Cseekb" default="deploy">
<!-- 描述 -->
<description>
Product Back End Deploy
</description>
<!-- =================================
target: os check
================================= -->
<!-- -->
<condition property="isWindows">
<os family="windows" />
</condition>
<condition property="isLinux">
<os family="unix" />
</condition>
<property name="src.dir" location="${basedir}/src" />
<property name="web.dir" location="${basedir}/web" />
<property name="web.web-inf.dir" location="${web.dir}/WEB-INF" />
<property name="lib.dir" location="${web.web-inf.dir}/lib" />
<property name="classes.dir" location="${web.web-inf.dir}/classes" />
<property name="ext-jar.dir" location="${basedir}/externaljar" />
<tstamp prefix="backup">
<format property="time" pattern="yyyy-MM-dd.HH.mm.ss" />
</tstamp>
<!-- 根据系统时间定义一个时间戳-->
<tstamp prefix="deploy-begin">
<format property="time" pattern="yyyy-MM-dd.HH.mm.ss" />
</tstamp>
<tstamp prefix="deploy-end">
<format property="time" pattern="yyyy-MM-dd.HH.mm.ss" />
</tstamp>
<!--path表示一个文件或路径名列表-->
<path id="classpath">
<!--Fileset 数据类型定义了一组文件-->
<fileset dir="${lib.dir}">
<!--该文件夹下所有以.jar结尾的文件-->
<include name="*.jar" />
</fileset>
<fileset dir="${ext-jar.dir}">
<include name="*.jar"/>
</fileset>
</path>
<property name="war.file.path" location="${basedir}/war" />
<property name="war.file.name" value="cseekb.war" />
<!-- 项目源文件路径 -->
<property name="project.source.dir" location="F:\WorkSpaces\Workspaces_Eclipse_S1\SSH_train02" />
<!-- 项目部署目标路径 -->
<property name="linux.deploy.dir" location="/home/tmg/deploy/cseekb2010/webapp" />
<!-- 项目WEB-INF备份路径 -->
<property name="linux.backup.dir" location="/home/tmg/deploy/cseekb2010/backup" />
<!-- =================================
target: deploy
================================= -->
<target name="deploy" depends="clean-classes-dir,full-compile,war-app,deploy-under-linux,deploy-under-windows">
<echo>now you can start tomcat.</echo>
</target>
<!-- =================================
target: linux-deploy
you should stop tomcat first
================================= -->
<!-- if表示仅当属性设置时才执行-->
<target name="deploy-under-linux" if="isLinux" depends="linux-backup-before-deploy">
<echo>start deploy</echo>
<echo>un-jar ${war.file.path}/${war.file.name} to ${linux.deploy.dir} at ${deploy-begin.time}</echo>
<echo>executing shell command : jar -xfM ${war.file.path}/${war.file.name} under dir : ${linux.deploy.dir}</echo>
<exec executable="jar" dir="${linux.deploy.dir}">
<arg value="-xfM" />
<arg value="${war.file.path}/${war.file.name}" />
</exec>
<echo>deploy complete at ${deploy-end.time}.</echo>
</target>
<target name="deploy-under-windows" if="isWindows">
<echo>一般使用Eclipse集成的tomcat进行测试,省略</echo>
</target>
<!-- =================================
target: linux-backup
you should stop tomcat first
move WEB-INF to backupdir, use mv command.
================================= -->
<target name="linux-backup-before-deploy" if="isLinux">
<echo>move previous WEB-INF to backup dir : ${linux.backup.dir}</echo>
<mkdir dir="${linux.backup.dir}" />
<exec executable="mv" dir="${linux.backup.dir}">
<arg value="WEB-INF" />
<arg value="${linux.backup.dir}/WEB-INF_${backup.time}" />
</exec>
<echo>move web-inf to ${linux.backup.dir}/WEB-INF_${backup.time} successfully</echo>
</target>
<!-- =================================
target: war-app
================================= -->
<target name="war-app">
<echo>make War ..</echo>
<mkdir dir="${war.file.path}" />
<!--将指定文件打成war包-->
<war warfile="${war.file.path}/${war.file.name}" webxml="${web.web-inf.dir}/web.xml">
<lib dir="${lib.dir}" />
<classes dir="${classes.dir}" />
<fileset dir="${web.dir}">
</fileset>
</war>
<echo>War Success : ${war.file.path}/${war.file.name}</echo>
</target>
<!-- =================================
target: full-compile
================================= -->
<target name="full-compile" depends="copy-resource-to-classes" description="description">
<echo>start compile.</echo>
<!--编译,其中refild标签是引用之前定义的name为classpath的path文件或路径-->
<javac encoding="ISO-8859-1" srcdir="${src.dir}" destdir="${classes.dir}">
<classpath refid="classpath" />
</javac>
<echo>full-compile successfully.</echo>
</target>
<!-- =========================================
target: update project source from svn
========================================= -->
<target name="update-from-svn" description="update the project from svn">
<echo>executing command : svn update . -r HEAD --username=XXXX --password=XXXX under dir : </echo>
<exec executable="svn" dir="${project.source.dir}">
<arg value="update" />
<arg value="." />
<arg value="-r" />
<arg value="HEAD" />
<arg value="--username=deployer" />
<arg value="--password=deployer_pwd0328" />
</exec>
</target>
<!-- copy src/**/*.(xml|properties ...) to classes dir -->
<target name="copy-resource-to-classes">
<!--将指定文件拷贝到指定目录-->
<copy todir="${classes.dir}">
<fileset dir="${src.dir}">
<!-- 表示除了以.java结尾的文件都包含-->
<exclude name="**/*.java" />
</fileset>
</copy>
</target>
<!-- delete the whole classes dir -->
<target name="clean-classes-dir">
<delete dir="${classes.dir}" />
<echo>${classes.dir} deleted.</echo>
</target>
<!-- delete the all jar file under lib dir -->
<target name="clean-web-lib-dir">
<delete dir="${lib.dir}">
<fileset includes="*.jar" />
</delete>
</target>
</project>