一 Ant 介紹html
Ant是構建工具,用來實現軟件的自動化的構建,相似於VisualStudio的project文件,Linux上構建C++的makefile,Ant一般用來構建Java程序。java
Ant是基於XML的文件,因此更容易閱讀;Ant是用Java實現的,自己支持跨平臺;Ant基於插件的方式開發,自己內置了經常使用的大部分的插件,並且第三方的擴展也很容易;Ant除了用來構建Java程序,也能夠用來構建其餘的任何程序,例如C++等。web
和Ant相似,可以支持跨平臺的其餘的一些很是優秀的構建工具備Maven,Scons,CMake等。apache
二 Ant的配置app
1)安裝jdk,設置
JAVA_HOME=D:\Java\Jdk1.5
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jarless
path=%JAVA_HOME%\bin;%path%webapp
2)下載安裝Ant,且設置
ANT_HOME=E:\Lab\apache-ant-1.8.2jsp
path=E:\Lab\apache-ant-1.8.2\bin工具
3) 最後驗證是否安裝成功在dos中輸入ant,若是顯示網站
Buildfile: build.xml does not exist!
Build failed
則安裝成功
三 Ant的基礎元素
1)Project元素
Project元素是Ant文件的根元素,Ant構建文件中至少應該包含一個project元素,不然會發生錯誤。在每一個project元素下面能夠包含多個target元素。project的屬性包括:
name : 項目名稱
default:當調用時沒有指定target時,此project的默認targe
basedir:用於指定基路徑的位置,改屬性沒有指定時,使用Ant的構建文件的父目錄做爲基路徑
例如:
< ?xml version="1.0" ?>
< project name ="antPro" default ="getBaseDir" basedir ="C:/ThinkInJavaCode">
<target name="getBaseDir">
<echo message="The base dir is: ${basedir}"/>
</target>
< /project>
從上例能夠看出,在這裏定義了default 屬性的值爲getBaseDir ,即當運行ant 命令時,若是沒有指明待執行的target,則將執行默認的target--getBaseDir 。此外,還定義了basedir 屬性的值爲 "C:/ThinkInJavaCode" ,進入"C:/ThinkInJavaCode" 後運行ant 命令,得一下結果:
Buildfile: C:\ThinkInJavaCode\build.xml
sayBaseDir:
[echo] The base dir is: C:\ThinkInJavaCode
BUILD SUCCESSFUL
Total time: 0 seconds
2)target元素
target爲Ant的基本執行單元,他能夠包含一個或多個具體的任務。
target的屬性有:
name: target的名稱,這個屬性在一個project中是惟一的。咱們能夠經過指定 target 元素的名稱來指定某個 target 。
depends:用來描述target間的依賴關係,若與多個 target 存在依賴關係時,須要以「,」間隔。 Ant 會依照 depends 屬性中 target 出現的順序依次執行每一個 target 。被依賴的 target 會先執行。
if:用於驗證指定的屬性是否存在,若不存在,所在 target 將不會被執行。
unless:該屬性的功能與 if 屬性的功能正好相反,它也用於驗證指定的屬性是否存在,若不存在,所在 target 將會被執行。
description:該屬性是關於 target 功能的簡短描述和說明。
多個target能夠存在相互依賴的關係。Ant會依照depends屬性中target出現的順序依次執行每一個target。然而,要記住的是隻要某個target依賴於一個target,後者就會被先執行。
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
假定咱們要執行target D。從它的依賴屬性來看,你可能認爲先執行C,而後B,最後A被執行。錯了,C依賴於B,B依賴於A,因此先執行A,而後B,而後C,最後D被執行。
一個target只能被執行一次,即時有多個target依賴於它。
3)property元素
property元素可看做變量或者參數的定義(即常常使用的變量),project 的屬性能夠經過 property 元素來設定,也可在 Ant 以外設定。例如<property name ="name" value ="philander"/>。若要在外部引入某文件,例如 build.properties 文件,能夠經過以下內容將其引入<property file=」 build.properties」/>。
Ant 提供了一些內置的屬性,它能獲得的系統屬性的列表與 Java 文檔中 System.getPropertis() 方法獲得的屬性一致,這些系統屬性可參考 sun 網站的說明。同時, Ant 還提供了一些它本身的內置屬性,以下:
basedir:project 基目錄的絕對路徑;
ant.file:buildfile的絕對路徑,上例中ant.file值爲C:\ThinkInJavaCode\build.xml;
ant.version:Ant 的版本信息,本文爲1.8.1 ;
ant.project.name:當前指定的project的名字,即前文說到的project的name屬性值;
ant.java.version:Ant 檢測到的JDK版本,本文爲 1.6 。
舉例說明以下:
<? xml version="1.0" ?>
<project name ="propertyPro" default ="example">
<property name ="name" value ="philander"/>
<property name ="age" value ="25"/>
<target name ="example">
<echo message ="name: ${name}, age: ${age}"/>
</target>
</project>
上例中用戶設置了名爲name 和age的兩個屬性,這兩個屬性設置後,在下文中能夠經過 ${name} 和 ${age} 分別取得這兩個屬性值。
四 ANT經常使用命令
1. copy 命令
copy主要用來對文件和目錄的複製功能。舉例以下:
eg1. 複製單個文件:
<copy file="original.txt" tofile="copied.txt"/>
eg2. 對文件目錄進行復制:
<copy todir="../dest_dir">
<fileset dir="src_dir"/>
</copy>
eg3. 將文件複製到另外的目錄:
<copy file="source.txt" todir="../home/philander"/>
2. delete 命令
對文件或目錄進行刪除,舉例以下:
eg1. 刪除某個文件:
<delete file="/home/photos/philander.jpg"/>
eg2. 刪除某個目錄:
<delete dir="/home/photos"/>
eg3. 刪除全部的備份目錄或空目錄:
<delete includeEmptyDirs="true">
<fileset dir="." includes="**/*.bak"/>
</delete>
3. mkdir 命令
建立目錄。 eg :
<mkdir dir="/home/philander/build/classes"/>
4. move 命令
移動文件或目錄,舉例以下:
eg1. 移動單個文件:
<move file="sourcefile" tofile=」destfile」/>
eg2. 移動單個文件到另外一個目錄:
<move file="sourcefile" todir=」movedir」/>
eg3. 移動某個目錄到另外一個目錄:
<move todir="newdir"> <fileset dir="olddir"/></move>
5. echo 命令
該任務的做用是根據日誌或監控器的級別輸出信息。它包括 message 、 file 、 append 和 level 四個屬性,舉例以下
<echo message="Hello,ANT" file="/home/philander/logs/ant.log" append="true">
五 利用ant 構建和部署Java項目
Ant 能夠代替使用 javac 、 java 和 jar 等命令來執行 java 操做,從而達到輕鬆的構建和部署 Java 項目的目的。
1. 利用ant 的javac命令來編譯Java程序
Ant 的javac命令用於實現編譯Java 程序的功能。下面來看一個簡單的例子:首先咱們創建名爲 JavaTestPro的Java項目,創建src目錄爲源代碼目錄,在src目錄下創建HelloWorld.java這個類文件。該類文件的內容以下:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("hello world!");
}
}
同時在JavaTestPro項目的根目錄下創建build.xml 文件,在該文件中編譯src 目錄下的Java文件,並將編譯後的class文件放入build/classes 目錄中,整個項目的目錄結構以下:
|JavaTestPro
|src
|build
|classes
|build.xml
在編譯前,需清除classes 目錄,該文件的內容以下:
<?xml version="1.0" ?>
<project name ="javacTest" default="compile" basedir=".">
<target name="clean">
<delete dir="${basedir}/build"/>
</target>
<target name="compile" depends ="clean">
<mkdir dir ="${basedir}/build/classes"/>
<javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
</target>
</project>
在項目根目錄(C:\ThinkInJavaCode\JavaTestPro)執行ant命令後,可在該目錄下發現新生成的build/classes子目錄,編譯後生成的HelloWorld.class文件就在該目錄下。
2. 使用java命令執行Java程序
Ant 中可使用 java命令實現運行Java程序的功能。能夠在上面的build.xml基礎上作修改來實現:
<?xml version="1.0" ?>
<project name ="javacTest" default="run" basedir=".">
<target name="clean">
<delete dir="${basedir}/build"/>
</target>
<target name="compile" depends ="clean">
<mkdir dir ="${basedir}/build/classes"/>
<javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
</target>
<target name="run" depends ="compile">
<java classname ="HelloWorld">
<classpath>
<pathelement path="${basedir}/build/classes"/>
</classpath>
</java>
</target>
</project>
接着,就能夠在控制檯看見輸出:"[java] hello world!"
3. 使用jar命令生成jar文件
還能夠在上例的基礎上更進一步,來生成jar包,可在run 這個 target 下再加上以下 target :
<?xml version="1.0" ?>
<project name ="javacTest" default="jar" basedir=".">
<target name="clean">
<delete dir="${basedir}/build"/>
</target>
<target name="compile" depends ="clean">
<mkdir dir ="${basedir}/build/classes"/>
<javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
</target>
<target name="run" depends="compile">
<java classname ="HelloWorld">
<classpath>
<pathelement path="${basedir}/build/classes"/>
</classpath>
</java>
</target>
<target name="jar" depends="run">
<jar destfile="helloworld.jar" basedir="${basedir}/build/classes">
<manifest>
<attribute name="Main-class" value="HelloWorld"/>
</manifest>
</jar>
</target >
</project>
其中,project的default 屬性設置爲應設爲jar,ant運行完畢後,可看到在項目的根目錄下生成了一個 helloworld.jar的jar包 。可經過運行如下命令來執行該jar包:
java -jar helloworld.jar
4. 使用war命令打包JavaEE項目
創建一個JavaEE項目,其中src 爲Java源代碼目錄,WebContent爲各jsp存放目錄,lib 爲項目引用的的包的目錄。在WebTest項目目錄下創建了build.xml 文件,該文件爲該工程的 Ant 構件文件。
|WebContent
|src
|build
|classes
|WebContent
|META-INF
|MANIFEST.MF
|WEB-INF
|lib
|classes
|HelloJSP.jsp
|build.xml
讀者能夠 src 目錄下放入在前續例子中開發的 HelloWorld.java 文件,並在 WebContent下創建 HelloJSP.jsp 文件,其內容很簡單,就是輸出 Hello 信息,代碼以下所示以下
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>war test for ant</title>
</head>
<body>
Hello JSP!Hello Ant!
</body>
</html>
接下來編寫 build.xml 文件,其內容以下:
<?xml version="1.0" encoding="UTF-8" ?>
<project name ="WebTest" default ="war" basedir =".">
<property name ="classes" value ="${basedir}/build/classes"/>
<property name ="build" value ="${basedir}/build"/>
<property name ="lib" value ="${basedir}/WebContent/WEB-INF/lib"/>
<!-- 刪除build 路徑-->
<target name ="clean">
<delete dir ="${build}"/>
</target>
<!-- 創建build/classes 路徑,並編譯class 文件到build/classes 路徑下-->
<target name ="compile" depends ="clean">
<mkdir dir ="${classes}"/>
<javac srcdir ="${basedir}/src" destdir ="${classes}"/>
</target>
<!-- 打war 包-->
<target name ="war" depends ="compile">
<war destfile ="${build}/WebTest.war" webxml ="${basedir}/WebContent/WEB-INF/web.xml">
<!-- 拷貝WebRoot 下除了WEB-INF 和META-INF 的兩個文件夾-->
<fileset dir ="${basedir}/WebContent" includes ="**/*.jsp"/>
<!-- 拷貝lib 目錄下的jar 包-->
<lib dir ="${lib}"/>
<!-- 拷貝build/classes 下的class 文件-->
<classes dir ="${classes}"/>
</war>
</target>
</project>
在C:\ThinkInJavaCode\WebTest目錄下運行ant後,就生成了WebTest.war 文件了,而後能夠將其放入Web容器(如Tomcat)的相應目錄下(${Tomcata安裝目錄}\webapps)運行該web項目了。
參考:
http://www.cnblogs.com/wangchenyang/archive/2011/09/14/2176688.html
http://www.cnblogs.com/philander/articles/1782254.html
感謝,Thanks!
做者:iTech
出處:http://itech.cnblogs.com/