ant教程
1,什麼是ant
ant是構建工具
2,什麼是構建
概念到處可查到,形象來說,你要把代碼從某個處所拿來,編譯,再拷貝到某個處所往等等把持,當然不僅與此,但是重要用來干這個
3,ant的利益
跨平台 --由於ant是應用Java實現的,所以它跨平台
應用簡略--與ant的兄弟make比起來
語法明白--同樣是和make相比
功效強盛--ant能做的事情許多,可能你用了很久,你仍然不知道它能有多少功效。當你自己開發一些ant插件的時候,你會發明它更多的功效。
4,ant的兄弟make
ant做的許多事情,大部分是曾經有一個叫make的所做的,不過對象不同,make更多利用於c/c++ ,ant更多利用於Java。當然這不是必定的,但大部分人如此。
一,構建ant環境
要應用ant首先要構建一個ant環境,步驟很簡略:
1),安裝jdk,設置Java_HOME ,PATH ,CLASS_PATH(這些應當是看這篇文章的人應當知道的)
2),下載ant 地址http://www.apache.org/找一個你愛好的版本,或者干脆最新的版本
3),解壓ant 你得到的是一個壓縮包,解壓縮它,並把它放在一個盡量簡略的目錄,例如D:\ant-1.6固然你不一 定要這麼做,但這麼做是有利益的。
4),設置ANT_HOME PATH中添加ANT_HOME目錄下的bin目錄
5),測試一下你的設置,開端-->運行-->cmd進進命令行-->鍵進 ant 回車,假如看到
Buildfile: build.XML does not exist!
Build failed
那麼恭喜你你已經完成ant的設置
二,體驗ant
就像每個語言都有HelloWorld一樣,一個最簡略的利用能讓人感受一下Ant
1,首先你要知道你要干什麼,我現在想做的事情是:
編寫一些程序
編譯它們
把它打包成jar包
把他們放在應當放置的處所
運行它們
這裡為了簡略起見只寫一個程序,就是HelloWorld.Java程序代碼如下:
package test.ant;
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello world1");
}
};
2,為了達到上邊的目標,你可以手動的用javac 、copy 、jar、java來完成,但是考慮一下假如你有成百上千個類,在多次調試,安排的時候,一次次的Javac 、copy、jar、
Java那將是一份辛苦的工作。現在看看ant怎麼優雅的完成它們。
要運行ant需要有一個build.XML固然不必定要叫這個名字,但是建議你這麼做
下邊就是一個完整的build.XML,然後我們來具體的說明每一句
<?XML version="1.0" encoding="UTF-8" ?>
<project name="HelloWorld" default="run" basedir=".">
<property name="src" value="src"/>
<property name="dest" value="classes"/>
<property name="hello_jar" value="hello1.jar"/>
<target name="init">
<mkdir dir="${dest}"/>
</target>
<target name="compile" depends="init">
<Javac srcdir="${src}" destdir="${dest}"/>
</target>
<target name="build" depends="compile">
<jar jarfile="${hello_jar}" basedir="${dest}"/>
</target>
<target name="run" depends="build">
<Java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>
</target>
<target name="clean">
<delete dir="${dest}" />
<delete file="${hello_jar}" />
</target>
<target name="rerun" depends="clean,run">
<ant target="clean" />
<ant target="run" />
</target>
</project>
說明:
<?XML version="1.0" encoding="UTF-8" ?>
build.XML中的第一句話,沒有實際的意義
<project name="HelloWorld" default="run" basedir=".">
</project>
ant的所有內容必需包含在這個裡邊,name是你給它取的名字,basedir故名思意就是工作的根目錄 .代表當前目錄。default代表默認要做的事情。
<property name="src" value="src"/>
類似程序中的變量,為什麼這麼做想一下變量的作用
<target name="compile" depends="init">
<Javac srcdir="${src}" destdir="${dest}"/>
</target>
把你想做的每一件事情寫成一個target ,它有一個名字,depends是它所依附的target,在履行這個target 例如這裡的compile之前ant會先檢查init是否曾經被履行過,假如履行
過則直接直接履行compile,假如沒有則會先履行它依附的target例如這裡的init,然後在履行這個target
如我們的打算
編譯:
<target name="compile" depends="init">
<Javac srcdir="${src}" destdir="${dest}"/>
</target>
做jar包:
<target name="build" depends="compile"> <jar jarfile="${hello_jar}" basedir="${dest}"/>
</target>
運行:
<target name="run" depends="build">
<Java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>
</target>
為了不用拷貝,我們可以在最開端定義好目標文件夾,這樣ant直接把成果就放在目標文件夾中了
新建文件夾:
<target name="init">
<mkdir dir="${dest}"/>
</target>
為了更多一點的功效體現,又加進了兩個target
刪除天生的文件
<target name="clean">
<delete dir="${dest}" />
<delete file="${hello_jar}" />
</target>
再次運行,這裡顯示了如何在一個target裡邊調用其他的target
<target name="rerun" depends="clean,run">
<ant target="clean" />
<ant target="run" />
</target>
好了,說明完成了,下邊檢驗一下你的ant吧
新建一個src的文件夾,然後把HelloWorld.Java按照包目錄放進往
做好build.XML文件
在命令行下鍵進ant ,你會發明一個個任務都完成了。每次更改完代碼只需要再次鍵進ant
有的時候我們可能並不想運行程序,只想履行這些步驟中的某一兩個步驟,例如我只想重新安排而不想運行,鍵進
ant build
ant中的每一個任務都可以這樣調用ant + target name
好了,這樣一個簡略的ant任務完成了。
一,什麼時候應用ant
也許你聽到別人說起ant,一時激動准備學習一下ant,當你看完了上邊的第一個實例,也許你感到ant真好,也許你感到ant不過如此,得出這些結論都不能說錯,固然ant很好用,
但並不是在任何情況下都是最好的選擇,例如Windows上有更多更簡略,更輕易應用的工具,比如eclipse+myeclipse eclipse+wtp等等,無論是編譯,安排,運行應用起來比ant更
輕易,方便但有些情況則是ant施展的利益所:
1,服務器上安排的時候
當你的程序開發完成,安排職員要安排在服務器上的時候,總不能由於由於安裝一個程序就配置一個eclipse+myeclipse吧,ant在這個時候是個很好的選擇,由於它小巧,輕易配
置,你帶著你寫好的build.XML到任何一台服務器上,只需要做簡略的修正(一些設定,例如目錄),然後一兩個命令完成,這難道不是一件美好的事情嗎。
2,Linux上,許多時候是這樣的,程序開發是在Windows下,但是程序要在linux或者unix上運行,在Linux或者
在unix(特別是unix上)安排是個麻煩的事情,這個時候ant的特點又出來了,由於ant是跨平台的,你在build.XML可以在大多數把持系統上應用,基礎不需要修正。
3,當服務器保護者不懂編程的時候
許多人都有過這樣的經歷,應用你們程序的人,並不懂得寫程序。你得程序由於版本更新,由於修正bug需要一次又一次得重新安排。這個時候你會發明教一個人是如此得艱苦。但
是有ant後,你只需要告訴他,輸進ant ***等一兩個命令,一切ok.
以上是項目開發經常碰到得一些情況。
看完以上得情況,好好考慮一下,你是否需要應用ant,假如是持續。
進一步學習一個稍微復雜一點點的ant
在實際的工作過程中可能會呈現以下一些情況,一個項目分成許多個模塊,每個小組或者部分負責一個模塊,為了測試,他們自己寫了一個build.XML,而你負責把這些模塊組合到
一起應用,寫一個build.XML
這個時候你有兩種選擇:
1,自己重新寫一個build.XML ,這將是一個麻煩的事情
2,盡量利用他們已經寫好的build.XML,減少自己的工作
舉個例子:
假設你下邊有三個小組,每個小組負責一個部分,他們分辨有一個src 和一個寫好的build.XML
這個時候你拿到他們的src,你需要做的是建立三個文件夾src1 ,src2, src3分辨把他們的src和build.xml放進往,然後寫一個build.XML
<?XML version="1.0" encoding="UTF-8" ?>
<project name="main" default="build" basedir=".">
<property name="bin" value="${basedir}\bin" />
<property name="src1" value="${basedir}\src1" />
<property name="src2" value="${basedir}\src2" />
<property name="src3" value="${basedir}\src3" />
<target name="init">
<mkdir dir="${bin}" />
</target>
<target name="run">
<ant dir="${src1}" target="run" />
<ant dir="${src2}" target="run" />
<ant dir="${src3}" target="run" />
</target>
<target name="clean">
<ant dir="${src1}" target="clean" />
<ant dir="${src2}" target="clean" />
<ant dir="${src3}" target="clean" />
</target>
<target name="build" depends="init,call">
<copy todir="${bin}">
<fileset dir="${src1}">
<include name="*.jar" />
</fileset>
<fileset dir="${src2}">
<include name="*.jar" />
</fileset>
<fileset dir="${src3}">
<include name="*.jar" />
</fileset>
</copy>
</target>
<target name="rebuild" depends="build,clean">
<ant target="clean" />
<ant target="build" />
</target>
</project>
ok你的任務完成了。
ok,上邊你完成了任務,但是你是否有些感歎呢,在那些build.XML中,大多數是重復的,而且更改一次目錄需要更改不少東西。是否能讓工作做的更好一點呢,答案是確定的。
引進兩個東西:
1,propery
2,XML include
這兩個東西都有一個功效,就是能把build.XML中<propery />中的內容分別出來,共同應用
除此之外它們各有特點:
propery的特點是保護簡略,只需要簡略的鍵值對,由於並不是所有人都愛好XML的格局
XML include的特點是不單可以提取出屬性來,連target也可以。
還是以前的例子:
例如我們想把src1 src2 src3這三個屬性從XML中提出來,可以新建一個文件叫all.propertIEs
裡邊的內容
src1=D:\\study\\ant\\src1
src2=D:\\study\\ant\\src2
src3=D:\\study\\ant\\src3
然後你的build.xml文件可以這樣寫,別人只需要更改配置文件,而不許要更改你的build.XML文件了
<?XML version="1.0" encoding="UTF-8" ?>
<project name="main" default="build" basedir=".">
<property file="all.propertIEs" />
<property name="bin" value="${basedir}\bin" />
<target name="init">
<mkdir dir="${bin}" />
</target>
<target name="run">
<ant dir="${src1}" target="run" />
<ant dir="${src2}" target="run" />
<ant dir="${src3}" target="run" />
</target>
<target name="clean">
<ant dir="${src1}" target="clean" />
<ant dir="${src2}" target="clean" />
<ant dir="${src3}" target="clean" />
</target>
<target name="build" depends="init,call">
<copy todir="${bin}">
<fileset dir="${src1}">
<include name="*.jar" />
</fileset>
<fileset dir="${src2}">
<include name="*.jar" />
</fileset>
<fileset dir="${src3}">
<include name="*.jar" />
</fileset>
</copy>
</target>
<target name="rebuild" depends="build,clean">
<ant target="clean" />
<ant target="build" />
</target>
<target name="test">
<ant dir="${src1}" target="test" />
<ant dir="${src2}" target="test" />
<ant dir="${src3}" target="test" />
</target>
</project>
假如你自己看的話你會看到這樣一個target
<target name="test">
<ant dir="${src1}" target="test" />
<ant dir="${src2}" target="test" />
<ant dir="${src3}" target="test" />
</target>
有的時候你想給每個小組的build.XML加進幾個target,一種做法是每個裡邊寫,然後在這裡調用
但是有一種更好的方法。
你可以寫一個include.XML文件,內容如下
<?XML version="1.0" encoding="UTF-8" ?>
<property name="src" value="src"/>
<property name="dest" value="classes"/>
<target name="test" >
<ant target="run" />
</target>
然後更改你三個小組的build.XML文件,每個裡邊加進如下內容
<!--include a XML file ,it can be common propery ,can be also a target -->
<!DOCTYPE project [
<!ENTITY share-variable SYSTEM "file:../include.XML">
]>
&share-variable;
變成如下的樣子
這個時候,你只要在include.xml添加propery , 添加target,三個build.XML會同時添加這些propery和target
而且不會讓三個組的build.XML變得更復雜。
<?XML version="1.0" encoding="UTF-8" ?>
<!--include a XML file ,it can be common propery ,can be also a target -->
<!DOCTYPE project [
<!ENTITY share-variable SYSTEM "file:../include.XML">
]>
<project name="HelloWorld" default="run" basedir=".">
<!--use the include -->
&share-variable;
<!--defined the property-->
<!--via include
<property name="src" value="src"/>
<property name="dest" value="classes"/>
-->
<property name="hello_jar" value="hello1.jar"/>
<!--define the op-->
<target name="init">
<mkdir dir="${dest}"/>
</target>
<target name="compile" depends="init">
<Javac srcdir="${src}" destdir="${dest}"/>
</target>
<target name="build" depends="compile">
<jar jarfile="${hello_jar}" basedir="${dest}"/>
</target>
<target name="run" depends="build">
<Java classname="test.ant.HelloWorld" classpath="${hello_jar}"/>
</target>
<target name="clean">
<delete dir="${dest}" />
<delete file="${hello_jar}" />
</target>
<target name="rerun" depends="clean,run">
<ant target="clean" />
<ant target="run" />
</target>
</project>
把握了上邊的那些內容之後,你就知道如何往寫一個好的ant,但是你會發明當你真的想往做的時候,你不能馬上作出好的build.XML,由於你知道太少的ant的默認供給的命令.這
個時候假如你想完成任務,並提高自己,有許多措施:
1,許多開源的程序都帶有build.XML,看看它們如何寫的
2,ant的document,裡邊具體列寫了ant的各種默認命令,及其豐富
3,google,永遠不要忘記它
ok,在這之後隨著你寫的ant build越來越多,你知道的命令就越多,ant在你的手裡也就越來越強盛了。
這個是一個慢慢積累的過程。
ant的例子很好找,各種開源框架都會帶有一個build.XML仔細看看,會有很大收獲
另外一個經常會用到的,但是在開源框架的build.XML一般沒有的是cvs 假如應用的是遠程的cvs,可以這樣應用
<XML version="1.0" encoding="utf-8"?>
<project>
<property name="cvsroot" value=":pserver:wang:@192.168.1.2:/cvsroot"/>
<property name="basedir" value="/tmp/testant/"/>
<property name="cvs.passWord" value="wang"/>
<property name="cvs.passfile" value="${basedir}/ant.cvspass"/>
<target name="initpass">
<cvspass cvsroot="${cvsroot}" password="${cvs.passWord}"
passfile="${cvs.passfile}"/>
</target>
<target name="checkout" depends="initpass">
<cvs cvsroot="${cvsroot}" command="checkout" cvsrsh="ssh"
package="myproject" dest="${basedir}" passfile="${cvs.passfile}"/>
</target>
</project>
在eclipse裡邊先天支撐ant,所以你可以在eclipse裡邊直接寫build.XML
由於eclipse供給了提示功效,主動補充功效,它能讓你事半功倍。
應用方法,只需要建立一個工程,然後建立一個叫build.XML的文件。然後就可以在裡邊寫你的ant build了