一、Ant介紹
Ant是Java的生成工具,是Apache的核心項目;直接在apache官網下載即可;
Ant類似於Unix中的Make工具,都是用來編譯、生成;
Ant是跨平臺的,而Make不能;
Ant的主要目的就是把你想做的事情自動化,不用你手動一步一步做,因爲裏面內置了javac、java、創建目錄、複製文件等功能,所以可以直接點擊Ant文件,即可編譯生成你的項目;
下載地址: http://ant.apache.org/bindownload.cgi
二、Ant配置
在Ant安裝之前需要安裝好JDK,並配置好JAVA_HOME;
Ant配置:
1.新建環境變量ANT_HOME:值爲ANT的主目錄;
2.在path中配置%ANT_HOME%/bin;
配置完成之後,打開命令行,輸入ant,當出現:
Buildfile: build.xml does not exist!
Build failed
時說明配置完成;
三、Ant入門
ant的默認生成文件爲build.xml;輸入ant後,ant會在當前目錄下搜索是否有build.xml,如果有,則執行;當然也可以自定義生成文件,通過ant -f a.xml即可指定a.xml爲生成文件;
ant的生成文件是xml文件,整體結構爲:
- <?xml version=“1.0” encoding=“GBK”?>
- <project default=“ targetname”>
- <target name=“name”>
- </target>
- </project>
<?xml version="1.0" encoding="GBK"?>
<project default=" targetname">
<target name="name">
</target>
</project>
project是生成文件的根元素,表示一個工程;
target是project的子元素,表示一個任務;一個project中可以定義多個target元素,表示多個任務;
default屬性表示默認執行的target,如果ant命令沒有指定target,則執行default的target;
ant targetname;則會執行此target,而忽略default設置的target;
注意:不能有兩個相同的targetname;
代碼舉例:創建並刪除hello目錄;
- <?xml version=“1.0” encoding=“gbk”?>
- <project default=“delete”>
- <property name=“name” value=“xiazdong”/>
- <target name=“delete” depends=“mkdir”>
- <delete dir=“{name}"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">target</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">target</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"mkdir"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">mkdir</span><span> </span><span class="attribute">dir</span><span>=</span><span class="attribute-value">" {name}”/>
- </target>
- </project>
<?xml version="1.0" encoding="gbk"?>
<project default="delete">
<property name="name" value="xiazdong"/>
<target name="delete" depends="mkdir">
<delete dir="${name}"/>
</target>
<target name="mkdir">
<mkdir dir="${name}"/>
</target>
</project>
四、Ant的XML元素詳解
1.<project>元素
是Ant生成文件的根元素;一般形式如:
<project default=” “[ basedir=”.” ] [name=”projectname”]>
default的值是默認執行的target名;
basedir是指定基準目錄,一般都是basedir=”.”
name是指工程名字;
2.<target>元素
是project元素的子元素,在project元素中能夠有多個target;一般形式如下:
<target name=” “ [ depends=” A “] [ if =” prop1 “] [ unless=” prop2”]>
</target>
name表示target的名稱;
depends中填寫其他target名稱(可以有多個名稱,用逗號分割),表示只有targetA完成之後才能夠做此target,如果執行此target,則會先執行A;
if的值表示一個屬性名,只有設置了該屬性名,才能執行此target;
unless的值表示一個屬性名,只有沒有設置該屬性名,才能執行此target;
3.<property>元素
是project的子元素;property用於定義屬性,一般形如:
(1)<property name=” pname “ value=” pvalue “/>
如果要使用此property,則需要${pname};類似於表達式語言;
(2)<property file=”a.properties”/> 通過此屬性文件導入屬性;
如果單純想使用
五、Task介紹
在Ant中Task是target的子元素,即一個target中可以有多個task;而Task分爲:
(1)核心Task;
(2)可選Task;
(3)自定義Task;
下面介紹一些常用的核心Task;
1.<echo>
用於單純輸出,一般形如:
<echo> </echo>
舉例:<echo>hello</echo>
2.<javac>
用於編譯java文件,一般形式如下:
<javac srcdir=” src ” destdir=” class “ [classpath=” “]/>;
srcdir是編譯此文件夾下或子文件夾下的全部java文件;
destdir是編譯後的class文件放置路徑;
classpath指定第三方類庫;
3.<java>
運行java類,一般形式如下:
<Java classname=” ” fork=”yes“>
【<arg line=”param1 param2 param3”/>】
</java>
classname用於指定運行的類名稱;
fork=”yes”表示另起一個JVM來執行java命令,而不是中斷ANT命令,因此fork必須爲yes;
4.<jar>
打包成jar包;一般形式如下:
<jar destfile=” main.jar” basedir=” “>
<manifest>
<attribute name=”Main-Class” value=”classname”/> <!–指定主類–>
</manifest>
</jar>
destfiie的值爲jar包的名稱;一般爲${dest}/main.jar;
basedir的值是需要打成jar包的目錄;一般爲${classes}
manifest表示設置META-INF;
5.<mkdir>
創建目錄,可以多層創建,比如a\b\c,則可以連續創建,一般形式如下:
<mkdir dir=”a\b”/>
6.<delete>
刪除目錄,一般形式如下:
<delete dir=”a\b”/> 可以刪除a目錄下的b目錄;
<delete file=”1.txt”/>可以刪除文件;
7.<tstamp>
時間戳,一般形式如下:
<tstamp />
接下來可以使用${DSTAMP}進行調用當前時間;
8.<copy>
複製文件,一般形式如下:
<copy file=”file1” tofile=”file2”/>
file是源文件;
tofile是目標文件;
9.<move>
移動文件,一般形式如下:
<move file=”file1” tofile=”file2”/>
file是源文件;
tofile是目標文件;
10.<replace>
用於替換字符串,類似於String的replace操作,一般形式如下:
<replace file=”filename” token=”old” value=”new”/>
file表示要執行替換的文件;
token表示被替換的字符串;
value表示替換的字符串;
代碼舉例:一般項目中的ant結構
- <project default=“init”>
- <property name=“src” value=“src”/>
- <property name=“classes” value=“classes”/>
- <property name=“dest” value=“dest”/>
- <path id=“classpath”>
- <pathelement path=“{classes}"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">path</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">target</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"help"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">echo</span><span class="tag">></span><span>help -打印幫助信息</span><span class="tag"></</span><span class="tag-name">echo</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">echo</span><span class="tag">></span><span>compile -編譯java源文件</span><span class="tag"></</span><span class="tag-name">echo</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">echo</span><span class="tag">></span><span>run -運行程序</span><span class="tag"></</span><span class="tag-name">echo</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">echo</span><span class="tag">></span><span>build -打成jar包</span><span class="tag"></</span><span class="tag-name">echo</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">echo</span><span class="tag">></span><span>clean -清楚全部編譯生成文件</span><span class="tag"></</span><span class="tag-name">echo</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">target</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">target</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"compile"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">delete</span><span> </span><span class="attribute">dir</span><span>=</span><span class="attribute-value">" {classes}”/>
- <mkdir dir=“{classes}"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">javac</span><span> </span><span class="attribute">srcdir</span><span>=</span><span class="attribute-value">" {src}” destdir=“{classes}"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">target</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">target</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"run"</span><span> </span><span class="attribute">depends</span><span>=</span><span class="attribute-value">"compile"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">java</span><span> </span><span class="attribute">classname</span><span>=</span><span class="attribute-value">"org.xiazdong.Test"</span><span> </span><span class="attribute">fork</span><span>=</span><span class="attribute-value">"yes"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">classpath</span><span> </span><span class="attribute">path</span><span>=</span><span class="attribute-value">" {classes}”/>
- </java>
- </target>
- <target name=“build” depends=“run”>
- <delete dir=“{dest}"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">mkdir</span><span> </span><span class="attribute">dir</span><span>=</span><span class="attribute-value">" {dest}”/>
- <jar destfile=“{dest}/Test.jar"</span><span> </span><span class="attribute">basedir</span><span>=</span><span class="attribute-value">" {classes}”>
- <manifest>
- <attribute name=“Main-Class” value=“org.xiazdong.Test”/>
- </manifest>
- </jar>
- </target>
- <target name=“clean”>
- <delete dir=“{classes}"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">delete</span><span> </span><span class="attribute">dir</span><span>=</span><span class="attribute-value">" {dest}”/>
- </target>
- </project>
<project default="init">
<property name="src" value="src"/>
<property name="classes" value="classes"/>
<property name="dest" value="dest"/>
<path id="classpath">
<pathelement path="${classes}"/>
</path>
<target name="help">
<echo>help -打印幫助信息</echo>
<echo>compile -編譯java源文件</echo>
<echo>run -運行程序</echo>
<echo>build -打成jar包</echo>
<echo>clean -清楚全部編譯生成文件</echo>
</target>
<target name="compile">
<delete dir="${classes}"/>
<mkdir dir="${classes}"/>
<javac srcdir="${src}" destdir="${classes}"/>
</target>
<target name="run" depends="compile">
<java classname="org.xiazdong.Test" fork="yes">
<classpath path="${classes}"/>
</java>
</target>
<target name="build" depends="run">
<delete dir="${dest}"/>
<mkdir dir="${dest}"/>
<jar destfile="${dest}/Test.jar" basedir="${classes}">
<manifest>
<attribute name="Main-Class" value="org.xiazdong.Test"/>
</manifest>
</jar>
</target>
<target name="clean">
<delete dir="${classes}"/>
<delete dir="${dest}"/>
</target>
</project>
總結一下:
- <?xml version = “1.0” encoding=“GBK”?>
- <project name=“Test” default=“” basedir=“.”>
- <property name=“src” value=“{basedir}\src"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">file</span><span>=</span><span class="attribute-value">" {basedir}\a.properties”/>
- <!–
- path用法
- 1.id屬性表示編號,用於被引用
- –>
- <path id=“classpath”>
- <!–
- pathelement的用法
- 1.path表示多個目錄,用“;”隔開目錄
- 2.location表示一個目錄
- –>
- <pathelement path=“lib;src”/>
- <pathelement location=“lib”/>
- <!–
- dirset的用法
- 1.dir屬性指定根目錄
- 2.子元素<include name=“ ”/>表示包含的目錄
- 3.子元素<exclude name=“ ”/>表示不包含的目錄
- –>
- <dirset dir=“lib”>
- <include name=“**/*Test*”/>
- <exclude name=“**/class”/>
- </dirset>
- <!–
- filelist的用法
- 1.dir屬性指定根路徑
- 2.files屬性指定文件名的列表,用”,”隔開
- –>
- <filelist dir=“lib” files=“a.xml,b.xml”/>
- <!–
- fileset用法
- 1.dir屬性指出根路徑
- 2.子元素<include name=“ ”/>指定包含的文件名
- –>
- <fileset dir=“lib”>
- <include name=“**/*.jar”/>
- </fileset>
- </path>
- <!–
- target用法
- 1.表示任務,子元素爲各種task的集合;
- –>
- <target name=“target1”>
- <!–
- javac用法
- 1.srcdir表示java文件的目錄
- 2.destdir表示class文件的保存目錄
- –>
- <javac srcdir=“src” destdir=“bin”>
- <!–
- classpath用法
- 1.refid引用前面的path指定的路徑
- –>
- <classpath refid=“classpath”/>
- </javac>
- <!–
- java用法
- 1.classname表示要運行的類
- 2.fork=“yes”一定要寫上!!
- –>
- <java classname=“Test” fork=“yes”>
- <classpath refid=“classpath”/>
- <!–
- arg表示指定的參數
- –>
- <arg value=“a b c”/>
- </java>
- <!–
- echo表示輸出
- –>
- <echo>Hello world</echo>
- <!–
- copy表示複製文件
- delete表示刪除文件
- mkdir表示創建目錄
- move表示移動文件
- –>
- <copy file=“src.txt” tofile=“dest.txt”/>
- <delete dir=“src”/>
- <mkdir dir=“src”/>
- <move file=“src.txt” tofile=“dest.txt”/>
- </target>
- </project>
<?xml version = "1.0" encoding="GBK"?>
<project name="Test" default="" basedir=".">
<property name="src" value="${basedir}\src"/>
<property file="${basedir}\a.properties"/>
<!--
path用法
1.id屬性表示編號,用於被引用
-->
<path id="classpath">
<!--
pathelement的用法
1.path表示多個目錄,用“;”隔開目錄
2.location表示一個目錄
-->
<pathelement path="lib;src"/>
<pathelement location="lib"/>
<!--
dirset的用法
1.dir屬性指定根目錄
2.子元素<include name=" "/>表示包含的目錄
3.子元素<exclude name=" "/>表示不包含的目錄
-->
<dirset dir="lib">
<include name="**/*Test*"/>
<exclude name="**/class"/>
</dirset>
<!--
filelist的用法
1.dir屬性指定根路徑
2.files屬性指定文件名的列表,用","隔開
-->
<filelist dir="lib" files="a.xml,b.xml"/>
<!--
fileset用法
1.dir屬性指出根路徑
2.子元素<include name=" "/>指定包含的文件名
-->
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
</path>
<!--
target用法
1.表示任務,子元素爲各種task的集合;
-->
<target name="target1">
<!--
javac用法
1.srcdir表示java文件的目錄
2.destdir表示class文件的保存目錄
-->
<javac srcdir="src" destdir="bin">
<!--
classpath用法
1.refid引用前面的path指定的路徑
-->
<classpath refid="classpath"/>
</javac>
<!--
java用法
1.classname表示要運行的類
2.fork="yes"一定要寫上!!
-->
<java classname="Test" fork="yes">
<classpath refid="classpath"/>
<!--
arg表示指定的參數
-->
<arg value="a b c"/>
</java>
<!--
echo表示輸出
-->
<echo>Hello world</echo>
<!--
copy表示複製文件
delete表示刪除文件
mkdir表示創建目錄
move表示移動文件
-->
<copy file="src.txt" tofile="dest.txt"/>
<delete dir="src"/>
<mkdir dir="src"/>
<move file="src.txt" tofile="dest.txt"/>
</target>
</project>
五、在Eclipse中使用Ant
在Eclipse中雖然沒有內置創建Ant的生成文件,但是可以通過配置完成;
(1)點擊 window–>preferences–>editors–>file associations;
(2)在File types中創建一個build.xml,並將associated editor的默認項設置爲ant editor即可;
當在項目中創建一個build.xml時,這個文件就是ant的生成文件;
六、模式匹配
在Ant中有一些基本的模式匹配的功能,比如:
*表示任意字符串,**表示任意數量的目錄;
(1)*.java,表示任意的java文件;
(2)*/*.java表示當前目錄的任意java文件;
(3)**/*.java表示當前目錄結構下的任意java文件;
<fileset dir=” src “>
<include name=”**/*.java”/>
<include name=”**/*.txt”/>
<exclude name=”**/*Test*”/>
</fileset>
表示包含src目錄下的所有java和txt文件,排除文件名包含Test的文件;
舉例:將java文件拷貝到dest文件夾下;
- <copy todir=“dest”>
- <span style=“white-space:pre”> </span><fileset dir=“.”>
- <span style=“white-space:pre”> </span><include name=“**/*.java”/>
- <span style=“white-space:pre”> </span></fileset>
- </copy>
<copy todir="dest">
<fileset dir=".">
<include name="**/*.java"/>
</fileset>
</copy>
七、自定義任務
自定義任務類似於JSP中的自定義標籤;
步驟:
(1)繼承org.apache.tools.Task;
(2)覆寫public void execute()throws BuildException;
(3)在類中添加的屬性即爲任務標籤的屬性;
(4)在build.xml中聲明任務<taskdef name=” ” classname=” ” classpath=”bin”/>
舉例:複製文件;
- package org.tools;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import org.apache.tools.ant.BuildException;
- import org.apache.tools.ant.Task;
- public class SimpleTask extends Task{
- private File file;
- private File tofile;
- public File getFile() {
- return file;
- }
- public void setFile(File file) {
- this.file = file;
- }
- public File getTofile() {
- return tofile;
- }
- public void setTofile(File tofile) {
- this.tofile = tofile;
- }
- @Override
- public void execute() throws BuildException {
- try {
- PrintWriter out = new PrintWriter(new FileWriter(tofile));
- BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
- String line = null;
- while((line=in.readLine())!=null){
- out.println(line);
- }
- out.close();
- in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
package org.tools;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
public class SimpleTask extends Task{
private File file;
private File tofile;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public File getTofile() {
return tofile;
}
public void setTofile(File tofile) {
this.tofile = tofile;
}
@Override
public void execute() throws BuildException {
try {
PrintWriter out = new PrintWriter(new FileWriter(tofile));
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line = null;
while((line=in.readLine())!=null){
out.println(line);
}
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
build.xml- <taskdef name=“MyCopy” classname=“org.tools.SimpleTask” classpath=“bin”></taskdef>
- <target name=“mycopy”>
- <MyCopy file=“2.txt” tofile=“output.txt”/>
- </target>
<taskdef name="MyCopy" classname="org.tools.SimpleTask" classpath="bin"></taskdef>
<target name="mycopy">
<MyCopy file="2.txt" tofile="output.txt"/>
</target>