Ant基础
?
一 Ant 介紹
Ant是構建工具,用來實現軟件的自動化的構建,類似于VisualStudio的project文件,Linux上構建C++的makefile,Ant通常用來構建Java程序。
Ant是基于XML的文件,所以更容易閱讀;Ant是用Java實現的,本身支持跨平臺;Ant基于插件的方式開發,本身內置了常用的大部分的插件,而且第三方的擴展也很容易;Ant除了用來構建Java程序,也可以用來構建其他的任何程序,例如C++等。
和Ant類似,能夠支持跨平臺的其他的一些非常優秀的構建工具有Maven,Scons,CMake等。
?
二 Ant的配置
1)安裝jdk,設置
JAVA_HOME=D:\Java\Jdk1.5
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
path=%JAVA_HOME%\bin;%path%
2)下載安裝Ant,且設置
ANT_HOME=E:\Lab\apache-ant-1.8.2
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
?
轉載于:https://www.cnblogs.com/itech/archive/2011/10/31/2230059.html
總結
- 上一篇: 【php数组函数序列】之array_co
- 下一篇: Linux 中SeLinux 的禁用方式