ant其实就是一个java的build工具,可以用来打jar或者war包
当前最新的版本是Ant1.8.1 ,下载地址:http://ant.apache.org/bindownload.cgi
配置很简单,在环境变量PATH加上 ant目录\bin就可以了
如果build.xml解析失败,可以加上
<?xml version="1.0" encoding="GBK" ?>
或者是加上
<?xml version="1.0" encoding="UTF-8" ?>
一、最简单的运用
首先写一个HelloWorld的类,放到src目录下
public class HelloWorld{ public static void main(String args[]){ System.out.println("Hello World!"); } }
新建一个build.xml文件
<project name="HelloWorld" default="run" basedir="." > <!-- 建一个project,默认执行为run --> <description>Ant Test</description> <!-- project描述 --> <!-- 声明变量 --> <property name="src.dir" value="src" /> <!-- 源文件目录 --> <property name="dest.dir" value="classes" /> <!-- 目标目录,编译生成的class目录 --> <property name="run.classpath" value="${dest.dir}" /> <!-- 执行的class所在目录 --> <target name="init"> <!-- 初始化,先生成目标目录 --> <mkdir dir="${dest.dir}" /> <!-- mkdir新建目录 --> </target> <target name="compile" depends="init"> <!-- 编译,依赖于init --> <javac srcdir="${src.dir}" destdir="${dest.dir}" includeantruntime="false"> </javac> </target> <target name="run" depends="compile"> <!-- 运行,依赖于compile --> <java classname="HelloWorld" classpath="${run.classpath}" /> </target> </project>
使用cmd进到build.xml 所在的目录,输入命令 ant 开始执行
每个target相当于一个模块,如果模块有依赖关系,则会先执行所依赖的模块
语法很简单,主要是三个 mkdir,javac,java
上面的build.xml有一个缺点,编译成功一次之后,再次执行时如果修改代码出现错误无法编译,但是还是会出现执行结果,因为先前生成的HelloWorld.class还在。 改进一下
<project name="HelloWorld" default="run" basedir="." > <!-- 建一个project,默认执行为run --> <description>Ant Test</description> <!-- project描述 --> <!-- 声明变量 --> <property name="src.dir" value="src" /> <!-- 源文件目录 --> <property name="dest.dir" value="classes" /> <!-- 目标目录,编译生成的class目录 --> <property name="run.classpath" value="${dest.dir}" /> <!-- 执行的class所在目录 --> <target name="init"> <!-- 初始化,先生成目标目录 --> <mkdir dir="${dest.dir}" /> <!-- mkdir新建目录 --> </target> <target name="compile" depends="init"> <!-- 编译,依赖于init --> <javac srcdir="${src.dir}" destdir="${dest.dir}" includeantruntime="false"> </javac> </target> <target name="run" depends="compile"> <!-- 运行,依赖于compile --> <java classname="HelloWorld" classpath="${run.classpath}" /> </target> <target name="clean"> <!-- 增加清除操作 --> <delete dir="${dest.dir}"/> </target> <target name="rerun" depends="clean"> <!-- rerun表示重新布署执行 --> <ant target="run" /> </target> </project>
通过使用ant rerun命令,可以实现重新布署,以免使用了旧版本的class来执行
二、引入外部包
java的dt.jar这个J2SE的标准包,不需要自己去写引入。 这次写的是引入其它第三方的jar包,单独一个没什么说的,主要说的是多个jar包的通配。
新建一个lib目录,把需要到的jar包放入其中
把HelloWorld的代码改一下,引入servlet的类,需要到的包为servlet-aip.jar,这个包在tomcat的lib目录下都有的
改后的HelloWorld.java为
import java.util.Date; import javax.servlet.Servlet; public class HelloWorld{ public static void main(String args[]){ System.out.println("Hello World!"); System.out.println(new Date()); } }
build.xml改后如下:
<project name="HelloWorld" default="run" basedir="." > <!-- 建一个project,默认执行为run --> <description>Ant Test</description> <!-- project描述 --> <!-- 声明变量 --> <property name="src.dir" value="src" /> <!-- 源文件目录 --> <property name="dest.dir" value="classes" /> <!-- 目标目录,编译生成的class目录 --> <property name="run.classpath" value="${dest.dir}" /> <!-- 执行的class所在目录 --> <path id="compile.classpath"> <!-- 编译所需要的包 --> <fileset dir="lib"> <!-- 使用fileset进行通配 --> <include name="*.jar" /> </fileset> </path> <target name="init"> <!-- 初始化,先生成目标目录 --> <mkdir dir="${dest.dir}" /> <!-- mkdir新建目录 --> </target> <target name="compile" depends="init"> <!-- 编译,依赖于init --> <javac srcdir="${src.dir}" destdir="${dest.dir}" includeantruntime="false"> <classpath refid="compile.classpath" /> <!-- 编译加上CLASSPATH --> </javac> </target> <target name="run" depends="compile"> <!-- 运行,依赖于compile --> <java classname="HelloWorld" classpath="${run.classpath}" /> </target> <target name="clean"> <!-- 增加清除操作 --> <delete dir="${dest.dir}"/> </target> <target name="rerun" depends="clean"> <!-- rerun表示重新布署执行 --> <ant target="run" /> </target> </project>
使用了path做为基点,再使用fileset进行多个jar包的通配,就可以达到把相应的jar导入到CLASSPATH的效果
如果你的第三方jar包放在多个目录,可以相应的把path改一下
<path id="compile.classpath"> <!-- 编译所需要的包 --> <fileset dir="lib"> <!-- 使用fileset进行通配 --> <include name="*.jar" /> </fileset> <fileset dir="TOMCAT_HOME\lib"> <!-- 其它位置的jar包 --> <include name="*.jar" /> </fileset> <pathelement path="${basedir}/lib/servlet-api.jar"/> <!-- 绝对路径下单独的包 --> <pathelement location="lib/servlet-api.jar"/> <!-- 相对路径下的单独包 --> <filelist dir="lib" dir="lib"> <!-- 使用filelist加载,这个可以加载相对路径的,也可以加载绝对路么的,但是不能通配,只能写全名 --> <file name="servlet-api.jar" /> </filelist> </path>
上面一共演示了四种加载情况,可以相互嵌套和多次使用,当然jar包不能冲突。