Ant
Ant是一個構建工具,是一個小程序。但是它通過自動完成所有的編譯代碼,運行測試以及打包重新部署的結果等繁瑣費力的任務來幫助軟件團隊開發大程序.
Ant 使用Java編寫,跨平臺,易使用且可伸縮。既可以用在小型個人項目中,也可以用於大型多團隊軟件項目。
Ant的目標是自動完成所有的構建過程。
Ant的核心概念
構建文件:-build.xml
•Ant使用稱之爲構建文件的xml文件來描述如何構建工程,在這個文件裏,開發者列出各種構建目標(target)以及達到這些目標的任務(task)。
一個構建文件包含一個項目-project <project>
每個項目包含多個目標 – target //每個target爲一個大任務
目標依賴於其他目標 – depends //大任務可以依賴於其他大任務,助理解:extends也有類似的依賴關係
目標包含任務 – javac,java,jar,war,copy,mkdir,delete,sql…//小任務
由任務完成所有工作。
第一個示例:
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="main" name="first">
<target name="main">
<!--編譯本目錄下的源文件-->
<javac srcdir="." includeAntRuntime="yes" destdir="."/>
<echo>Ok</echo>
</target>
</project>
所有構建文件都要有<project>元素,而且至少有一個<target> 元素。
對於<project> 元素的default 屬性並沒有默認值。
構建文件並不一定要被命名爲build.xml。不過build.xml是Ant 要搜索的默認文件名。
每個構建文件只能有一個<project> 元素
Ant任務(task)
一個task是一段可執行的代碼。
一個task可以有多個屬性(如果你願意的話,可以將其稱之爲變量)。屬性只可能包含對property的引用。這些引用會在task執行前被解析。
下面是Task的一般構造形式:
•<taskname attribute1="value1" attribute2="value2" ... />
•這裏taskname是task的名字,attributeN是屬性名,valueN是屬性值。
有一套內置的(built-in)task,以及一些可選task,但你也可以編寫自己的task。
所有的task都有一個task名字屬性。Ant用屬性值來產生日誌信息。
Ant核心任務之copy
1.拷貝單個的文件:
<copy file="myfile.txt" tofile="mycopy.txt"/>
2.拷貝單個的文件到指定目錄下
<copy file="myfile.txt" todir="../some/other/dir"/>
3.拷貝一個目錄到另外一個目錄下
<copy todir="../new/dir">
<fileset dir="src_dir"/>
</copy>
4.拷貝一批文件到指定目錄下
<copy todir="../dest/dir">
<fileset dir="src_dir">
<include name="**/*.java"/>
<exclude name="**/Test.java"/>
</fileset>
</copy>
<copy todir="../dest/dir">
<fileset dir="src_dir" excludes="**/*.java"/>
</copy>
5.拷貝一批文件到指定目錄下,將文件名後增加。Bak後綴
<copy todir="../backup/dir">
<fileset dir="src_dir"/>
<mapper type="glob" from="*" to="*.bak"/>
</copy>
6.拷貝一組文件到指定目錄下,替換其中的@標籤@內容
<copy todir="../backup/dir">
<fileset dir="src_dir"/>
<filterset>
<filter token="TITLE" value="Foo Bar"/>
</filterset>
</copy>
Ant核心任務之delete
刪除一個(組)文件或者目錄,例子:
1.刪除一個文件
<delete file="/lib/ant.jar"/>
2.刪除指定目錄及其子目錄
<delete dir="lib"/>
3.刪除指定的一組文件
<delete>
<fileset dir="." includes="**/*.bak"/>
</delete>
4.刪除指定目錄及其子目錄,包括他自己
<delete includeEmptyDirs="true">
<fileset dir="build"/>
</delete>
Ant核心任務move
Move:移動或重命名一個(組)文件、目錄,例子:
1.移動或重命名一個文件
<move file="file.orig" tofile="file.moved"/>
2.移動或重命名一個文件到另一個文件夾下面
<move file="file.orig" todir="dir/to/move/to"/>
3.將一個目錄移到另外一個目錄下
<move todir="new/dir/to/move/to">
<fileset dir="src/dir"/>
</move>
4.將一組文件移動到另外的目錄下
<move todir="some/new/dir">
<fileset dir="my/src/dir">
<include name="**/*.jar"/>
<exclude name="**/ant.jar"/>
</fileset>
</move>
5.移動文件過程中增加。Bak後綴
<move todir="my/src/dir">
<fileset dir="my/src/dir">
<exclude name="**/*.bak"/>
</fileset>
<mapper type="glob" from="*" to="*.bak"/>
</move>
Ant核心之javac
編譯java原代碼,例子
1.<javacsrcdir="{src}“ destdir="{build}“ classpath="xyz.jar“ debug="on"/>
編譯{src}目錄及其子目錄下的所有。Java文件。Class文件將放在{build}指定的目錄下,classpath表示需要用到的類文件或者目錄,debug設置爲on表示輸出debug信息
2.<javacsrcdir="{src}:{src2}“ destdir="{build}“ includes="mypackage/p1/**, mypackage/p2/**“ excludes="mypackage/p1/testpackage/**” classpath="xyz.jar"debug="on“ />
編譯{src}和{src2}目錄及其子目錄下的所有。Java文件,但是package/p1/**,mypackage/p2/**將被編譯,而mypackage/p1/testpackage/**將不會被編譯。Class文件將放在{build}指定的目錄下,classpath表示需要用到的類文件或者目錄,debug設置爲on表示輸出debug信息
3.<property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/>
<javacsrcdir="{src}“ destdir="{src}“ classpath="{classpath}“ debug="on"/>
路徑是在property中定義的
Ant核心任務之java
java執行指定的java類,例子:
1.<java classname="test.Main">
<classpath>
<pathelement location="dist/test.jar"/>
<pathelement path="{java.class.path}"/>
</classpath>
</java>
classname中指定要執行的類,classpath設定要使用的環境變量
2.<path id="project.class.path">
<pathelement location="lib/"/>
<pathelement path="{java.class.path}/"/>
<pathelement path="{additional.path}"/>
</path>
<target ... >
<rmic ...>
<classpathrefid="project.class.path"/>
</rmic>
</target>
Ant核心任務之jar
jar將一組文件打包,例子:
1.<jar destfile="{dist}/lib/app.jar" basedir="{build}/classes"/>
將{build}/classes下面的所有文件打包到{dist}/lib/app.jar中
2.<jar destfile="{dist}/lib/app.jar"
basedir="{build}/classes"
includes="mypackage/test/**"
excludes="**/Test.class"
/>
將{build}/classes下面的所有文件打包到{dist}/lib/app.jar中,但是包括mypackage/test/所有文件不包括所有的Test.class
3.<jar destfile="{dist}/lib/app.jar"
basedir="{build}/classes"
includes="mypackage/test/**"
excludes="**/Test.class"
manifest="my.mf"
/>
manifest屬性指定自己的META-INF/MANIFEST.MF文件,而不是由系統生成
Ant核心任務之war
對Jar的擴展,用於打包Web應用,例子:
假設我們的文件目錄如下:
thirdparty/libs/jdbc1.jar
thirdparty/libs/jdbc2.jar
build/main/com/myco/myapp/Servlet.class
src/metadata/myapp.xml
src/html/myapp/index.html
src/jsp/myapp/front.jsp
src/graphics/images/gifs/small/logo.gif
src/graphics/images/gifs/large/logo.gif
下面是我們的任務的內容:
<war destfile="myapp.war" webxml="src/metadata/myapp.xml">
<fileset dir="src/html/myapp"/>
<fileset dir="src/jsp/myapp"/>
<lib dir="thirdparty/libs"> <exclude name="jdbc1.jar"/> </lib>
<classes dir="build/main"/>
<zipfileset dir="src/graphics/images/gifs" prefix="images"/>
</war>
完成後的結果:
WEB-INF/web.xml
WEB-INF/lib/jdbc2.jar
WEB-INF/classes/com/myco/myapp/Servlet.class
META-INF/MANIFEST.MF
index.html
front.jsp
images/small/logo.gif
images/large/logo.gif
bulid.xml
<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." name="myProj" default="aa">
<target name="aa" depends="jdoc">
<echo message="Hello World!"></echo>
<echo >Ok</echo>
</target>
<target name="jdoc">
<echo>依賴target......</echo>
<javadoc sourcepath="src"
destdir="d:/a/b"
encoding="utf-8"
docencoding="gb2312"
></javadoc>
</target>
<target name="mdir">
<mkdir dir="d:/b/cdbs/asdb/abd/w/and/asdn/b.txt"/>
</target>
<target name="deldir">
<delete dir="d:a/cdbs"></delete>
</target>
<target name="movedir">
<move todir="D:\\a">
<fileset dir="D:\\b">
<include name="**/*.*"/>
</fileset>
</move>
</target>
<target name="jar">
<jar destfile="d:/lib/app.jar" basedir="${basedir}"/>
</target>
<property name="tomcat_home" value="E:\\MyEclipse 10.7\\apache-tomcat-7.0.30\\webapps"></property>
<target name="depoly" description="發佈項目到tomcat服務器">
<copy todir="${tomcat_home}/${ant.project.name}">
<fileset dir="${basedir}/WebRoot">
<include name="**/*.*"/>
</fileset>
</copy>
</target>
</project>