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包不能衝突。