Ant簡介
- Ant是一個構建工具,是一個小程序。但是它通過自動完成所有的編譯代碼,運行測試以及打包重新部署的結果等繁瑣費力的任務來幫助軟件團隊開發大程序。
- Ant 使用Java編寫,跨平臺,易使用且可伸縮。既可以用在小型個人項目中,也可以用於大型多團隊軟件項目。
- Ant的目標是自動完成所有的構建過程。
Ant核心概念
- 構建文件:Ant使用稱之爲構建文件的xml文件來描述如何構建工程,在這個文件裏,開發者列出各種構建目標(target)以及達到這些目標的任務(task)。
- 構建文件與項目、項目與目標、目標與任務的關係
- 一個構建文件包含一個項目,每個項目包含多個目標,目標依賴於其他目標,目標包含任務而任務是做工作的。
Ant下載與安裝
Ant下載
當前最新版本:1.9.3
筆記中使用版本:1.8.4
Ant安裝
通過配置環境變量,建立“ANT_HOME”並將其放入到“Path”中,如下圖所示:
驗證Ant是否安裝成功
當出現如下界面時表示已經安裝成功
Ant案例之Hello World
操作步驟
新建空文件夾,名稱爲demo
新建一個Java文件,名稱爲HelloWorld.java,其內容如下所示
class HelloWorld{
public static void main(String [] args){
System.out.println("Hello World!");
System.out.println("http://blog.csdn.net/mavs41");
}
}
編寫build.xml
<?xml version="1.0" ?>
<project name="firstbuild" default="run">
<target name="init">
<mkdir dir="build/classes" />
<mkdir dir="dist" />
</target>
<target name="compile" depends="init">
<javac srcdir="src" destdir="build/classes" />
<echo>編譯完成!</echo>
</target>
<target name="archive" depends="compile">
<jar destfile="dist/project.jar" basedir="build/classes" />
</target>
<target name="clean" depends="init">
<delete dir="build" />
<delete dir="dist" />
</target>
<target name="run" depends="compile">
<java classname="HelloWorld" classpath="build/classes" />
</target>
</project>
使用命令行方式運行ant
運行時報錯,HelloWorld類必須是public類型
修改後HelloWorld類如下所示
<span style="background-color: rgb(255, 0, 0);">public class</span> HelloWorld{
public static void main(String [] args){
System.out.println("Hello World!");
System.out.println("http://blog.csdn.net/mavs41");
}
}
重新編譯運行顯示成功
編譯運行成功後文件顯示
說明:將java工程分成源代碼文件夾,編譯後文件存放位置,發佈打包文件的存放位置。
src:源代碼文件夾
build:所有在構建時產生的文件
build/classes:中間輸出
dist:最終打包分發文件
Ant屬性
一個property有一個名字和一個值。property可用於task的屬性值。這是通過將屬性名放在“{”和“}”之間並放在屬性值的位置來實現的。
Ant任務
Ant任務(task)
- 一個task是一段可執行的代碼。
- 一個task可以有多個屬性(如果你願意的話,可以將其稱之爲變量)。屬性只可能包含對property的引用。這些引用會在task執行前被解析。
- 下面是Task的一般構造形式:
• <taskname attribute1="value1"attribute2="value2" ... />
• 這裏taskname是task的名字,attributeN是屬性名,valueN是屬性值。
• 有一套內置的(built-in)task,以及一些可選task,但你也可以編寫自己的task。
- 所有的task都有一個task名字屬性。Ant用屬性值來產生日誌信息。
demo.xml文件內容如下所示
<?xml version="1.0" ?>
<project name="mydemo" default="demo2">
<property name="p1" value="Hello Mavs41"/>
<!--One Target-->
<target name="demo1">
<!--Many Tasks-->
<echo message="Hello World!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo2" depends="demo1">
<!--Many Tasks-->
<echo message= "Hello Mavs!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo3" depends="demo1">
<echo>${p1}</echo>
</target>
</project>
運行結果如下所示
Ant核心任務之copy
拷貝單個的文件
<copy file="myfile.txt" tofile="mycopy.txt"/>
拷貝單個的文件到指定目錄下
<copy file="myfile.txt" todir="../some/other/dir"/>
拷貝一個目錄到另外一個目錄下
<copy todir="../new/dir">
<fileset dir="src_dir"/>
</copy>
拷貝一批文件到指定目錄下
<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>
demo.xml文件內容如下所示:
<?xml version="1.0" ?>
<project name="mydemo" default="demo2">
<property name="p1" value="Hello Mavs41"/>
<!--One Target-->
<target name="demo1">
<!--Many Tasks-->
<echo message="Hello World!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo2" depends="demo1">
<!--Many Tasks-->
<echo message= "Hello Mavs!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo3" depends="demo1">
<echo>${p1}</echo>
</target>
<!--One Target-->
<target name="demo4">
<echo message="Copy files"/>
<copy file="myfile.txt" tofile="mycopy.txt"/>
</target>
</project>
運行結果如下所示:
Ant核心任務之delete
刪除一個文件
<delete file="/lib/ant.jar"/>
刪除指定目錄及其子目錄
<delete dir="lib"/>
刪除指定的一組文件
<delete>
<fileset dir="." includes="**/*.bak"/>
</delete>
demo.xml文件內容如下所示
<?xml version="1.0" ?>
<project name="mydemo" default="demo2">
<property name="p1" value="Hello Mavs41"/>
<!--One Target-->
<target name="demo1">
<!--Many Tasks-->
<echo message="Hello World!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo2" depends="demo1">
<!--Many Tasks-->
<echo message= "Hello Mavs!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo3" depends="demo1">
<echo>${p1}</echo>
</target>
<!--One Target-->
<target name="demo4">
<echo message="Copy files"/>
<copy file="myfile.txt" tofile="mycopy.txt"/>
</target>
<!--One Target-->
<target name="demo5">
<echo message="Delete files"/>
<delete dir="mydelete"/>
</target>
</project>
運行結果如下所示
Ant核心任務之move
移動或重命名一個文件
<move file="file.orig" tofile="file.moved"/>
移動或重命名一個文件到另一個文件夾下面
<move file="file.org" todir="dir/to/move/to"/>
將一個目錄移到另外一個目錄下
<move todir="new/dir/to/move/to">
<fileset dir="src/dir"/>
</move>
將一組文件移動到另外的目錄下
<move todir="some/new/dir">
<fileset dir="my/src/dir">
<include name="**/*.jar"/>
<exclude name="**/ant.jar"/>
</fileset>
</move>
demo.xml文件內容如下所示
<?xml version="1.0" ?>
<project name="mydemo" default="demo2">
<property name="p1" value="Hello Mavs41"/>
<!--One Target-->
<target name="demo1">
<!--Many Tasks-->
<echo message="Hello World!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo2" depends="demo1">
<!--Many Tasks-->
<echo message= "Hello Mavs!"/>
<echo message="http://blog.csdn.net/mavs41"/>
</target>
<!--One Target-->
<target name="demo3" depends="demo1">
<echo>${p1}</echo>
</target>
<!--One Target-->
<target name="demo4">
<echo message="Copy files"/>
<copy file="myfile.txt" tofile="mycopy.txt"/>
</target>
<!--One Target-->
<target name="demo5">
<echo message="Delete files"/>
<delete dir="mydelete"/>
</target>
<!--One Target-->
<target name="demo6">
<echo message="Move files"/>
<move todir="mymove/dir">
<fileset dir="move/dir">
<include name="**/*.java"/>
<exclude name="**/Mavs.java"/>
</fileset>
</move>
</target>
</project>
運行結果如下所示
Ant核心任務之javac(編譯java源代碼)
格式1
<javac srcdir="{src}“ destdir="{build}“ classpath="xyz.jar“ debug="on"/>
編譯{src}目錄及其子目錄下的所有Java文件。Class文件將放在{build}指定的目錄下,classpath表示需要用到的類文件或者目錄,debug設置爲on表示輸出debug信息
格式2
<javac srcdir="{src}:{src2}“ destdir="{build}“ includes="mypackage/p1/**,mypackage/p2/**" excludes="mypackage/p1/testpackage/**“ classpath="xyz.jar"debug="on"/>
在javac中指定屬性
<property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/>
<javac srcdir="{src}“ destdir="{src}“ classpath="{classpath}“ debug="on"/>
路徑是在property中定義的
Ant核心任務之javac(執行指定Java類)
案例一
<java classname="test.Main">
<classpath>
<pathelement location="dist/test.jar"/>
<pathelement path="{java.class.path}"/>
</classpath>
</java>
classname中指定要執行的類,classpath設定要使用的環境變量
案例二
<path id="project.class.path">
<pathelement location="lib/"/>
<pathelement path="{java.class.path}/"/>
<pathelement path="{additional.path}"/>
</path>
<java classname="test.Main">
<classpath refid="project.class.path"/>>
</java>
Ant核心任務之jar
<jar destfile="{dist}/lib/app.jar” basedir="{build}/classes"/>
將{build}/classes下面的所有文件打包到{dist}/lib/app.jar中
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