ANT標籤詳解
1、<project>標籤
每個構建檔案對應一個專案,project標籤是構建檔案的跟標籤,它可以有多個內在屬性,各個屬性的含義分別如下所示:
default表示預設的執行目標,這個屬性是必須的。
basedir表示專案的基準路徑,這個屬性是必須的。
name表示專案名稱。
description表示專案的描述(或者是對這個標籤的作用進行表述)。
每個構建檔案都對應於一個專案,但是大型專案經常包含大量的子專案,每一個子專案都可以有自己的構建檔案。
2、<target>標籤
一個專案標籤下可以有一個或多個target標籤,一個target標籤可以依賴其他target標籤,target所有屬性如下所示:
name表示這個標籤的名字,這個屬性是必須的。
depends表示依賴的目標。
if表示僅當屬性設定時才執行。
unless表示當屬性沒有設定時才執行。
description表示專案的描述(或者是對這個標籤的作用進行表述)。
Ant的depends屬性指定了target的執行順序,Ant會依照depends屬性中target標籤出現順序依次執行每個target,在執行之前首先執行它所依賴的target標籤,例如:
專案中的名為run的target的depends屬性compile,而名為compile的target的depends屬性是init,所以這幾個target標籤的執行順序是init—》compile—》run。一個target只能被執行一次,即使有多個target依賴於它。如果沒有if或unless屬性,target總會被執行。
3、<mkdir>標籤
該標籤使用者建立一個目錄,它有一個屬性dir使用者指定所建立的目錄,其程式碼如下:
<mkdir dir="目錄名"/>
4、<jar>標籤
該標籤用來生成一個JAR包,其屬性如下:
jarfile表示生產JAR檔名。
basedir表示被歸檔的目錄。
includes表示別歸檔的檔案模式。
exchudes表示被排除的檔案模式。
5、<javac標籤>
該標籤用於編譯一個或一組java檔案,其屬性如下:
srcdir表示java源程式的目錄。
destdir表示class檔案的輸出目錄。
includes表示別歸檔的檔案模式。
exchudes表示被排除的檔案模式。
debug表示包含的除錯資訊。
optimize表示是否使用優化。
classpath表示所使用的類路徑。
verbose 表示提供詳細的輸出資訊。
fileonerror表示當碰到錯誤就自動停止。
6、<java>標籤
該標籤用來執行編譯生成的.class檔案,其屬性如下:
classname 表示將執行的類名。
jar表示包含該類的JAR檔名。
classpath所表示用到的類路徑。
fork表示在一個新的虛擬機器中執行該類。
failonerror表示當出現錯誤時自動停止。
output 表示輸出檔案。
append表示追加或者覆蓋預設檔案。
7、<delete>標籤
該標籤用於刪除一個檔案或一組檔案,其屬性如下:
file表示要刪除的檔案。
dir表示要刪除的目錄。
includeEmptyDirs 表示指定是否要刪除空目錄,預設值是刪除。
failonerror 表示指定當碰到錯誤是否停止,預設值是自動停止。
verbose表示指定是否列出所刪除的檔案,預設值為不列出。
8、<copy>標籤
該標籤用於檔案或檔案集的拷貝,其屬性如下:
file 表示原始檔。
tofile 表示目標檔案。
todir 表示目標目錄。
overwrite 表示指定是否覆蓋目標檔案,預設值是不覆蓋。
includeEmptyDirs 表示制定是否拷貝空目錄,預設值為拷貝。
failonerror 表示指定如目標沒有發現是否自動停止,預設值是停止。
verbose 表示制定是否顯示詳細資訊,預設值不顯示。
9、<war>標籤
該標籤用來生成一個WAR包,其屬性如下:
destfile表示生產JAR檔名。
dir表示被歸檔的檔案目錄。
includes表示別歸檔的檔案模式。
exchudes表示被排除的檔案模式。
10、<echo>標籤
該標籤用來在控制檯輸出資訊,其輸入如下:
message表示輸入的內容。
11.<exec>執行檔案:
<exec executable="${base.dir}/email.bat" >
</exec>
<exec executable="cmd" dir="D:\" failonerror="true">
<arg line="/c del 1.bat" />
</exec>
Ant的資料型別
在構建檔案中為了標識檔案或檔案組,經常需要使用資料型別。資料型別包含在
org.apache.tool.ant.types包中。簡單介紹構建檔案中一些常用的資料型別。
1. argument 型別
由Ant構建檔案呼叫的程式,可以通過<arg>元素向其傳遞命令列引數,如apply,exec和java任務均可接受巢狀<arg>元素,可以為各自的過程呼叫指定引數。以下是<arg>的所有屬性:
values 是一個命令引數,如果引數有空格,但又想將它作為單獨一個值,則使用此屬性。
file表示一個引數的檔名。在構建檔案中,此檔名相對於當前的工作目錄。
line表示用空格分隔的多個引數列表。
path表示路徑。
2.ervironment 型別
由Ant構建檔案呼叫的外部命令或程式,<env>元素制定了哪些環境變數要傳遞給正在執行的系統命令,<env>元素可以接受以下屬性:
file表示環境變數值得檔名。此檔名要被轉換位一個絕對路徑。
path表示環境變數的路徑。Ant會將它轉換為一個本地約定。
value 表示環境變數的一個直接變數。
key 表示環境變數名。
注意 file path 或 value只能取一個。
3.filelist型別
Filelist 是一個支援命名的檔案列表的資料型別,包含在一個filelist型別中的檔案不一定是存在的檔案。以下是其所有的屬性:
dir是用於計算絕對檔名的目錄。
files 是用逗號分隔的檔名列表。
refid 是對某處定義的一個<filelist>的引用。
注意 dir 和 files 都是必要的,除非指定了refid(這種情況下,dir和files都不允許使用)。
4.fileset型別
Fileset 資料型別定義了一組檔案,並通常表示為<fileset>元素。不過,許多ant任務構建成了隱式的fileset,這說明他們支援所有的fileset屬性和巢狀元素。以下為fileset 的屬性列表。
dir表示fileset 的基目錄。
casesensitive的值如果為false,那麼匹配檔名時,fileset不是區分大小寫的,其預設值為true.
defaultexcludes 用來確定是否使用預設的排除模式,預設為true。
excludes 是用逗號分隔的需要派出的檔案模式列表。
excludesfile 表示每行包含一個排除模式的檔案的檔名。
includes 是用逗號分隔的,需要包含的檔案模式列表。
includesfile 表示每行包括一個包含模式的檔名。
5.patternset 型別 Fileset 是對檔案的分組,而patternset是對模式的分組,他們是緊密相關的概念。
<patternset>支援4個屬性:includes excludex includexfile 和 excludesfile,與fileset相
同。Patternset 還允許以下巢狀元素:include,exclude,includefile 和 excludesfile.
6.filterset 型別
Filterset定義了一組過濾器,這些過濾器將在檔案移動或複製時完成檔案的文字替換。
主要屬性如下:
begintoken 表示巢狀過濾器所搜尋的記號,這是標識其開始的字串。
endtoken表示巢狀過濾器所搜尋的記號這是標識其結束的字串。
id是過濾器的唯一標誌符。
refid是對構建檔案中某處定義一個過濾器的引用。
7.Path型別Path元素用來表示一個類路徑,不過它還可以用於表示其他的路徑。在用作多個屬性時,路徑中的各項用分號或冒號隔開。在構建的時候,此分隔符將代替當前平臺中所有的路徑分隔符,其擁有的屬性如下:
location 表示一個檔案或目錄。Ant在內部將此擴充套件為一個絕對路徑。
refid 是對當前構建檔案中某處定義的一個path的引用。
path表示一個檔案或路徑名列表。
8.mapper型別Mapper型別定義了一組輸入檔案和一組輸出檔案間的關係,其屬性如下:
classname 表示實現mapper類的類名。當內建mapper不滿足要求時,用於建立定製mapper.
classpath表示查詢一個定製mapper時所用的型別路徑。
classpathref是對某處定義的一個類路徑的引用。
from屬性的含義取決於所用的mapper.
to屬性的含義取決於所用的mapper.
type屬性的取值為identity,flatten glob merge regexp 其中之一,它定義了要是用的內建mapper的型別。
ANT語法
ant(another nice tool) 主要用來編譯、執行、測試java程式碼。此外還可以收發郵件、執行sql以及打jar包和war包……
下載ant。ant有兩個版本,二進位制版本和原始碼版本。
要編譯和使用ant,你必須要有一個相容jaxp的xml解析器。
使用不同的xml解析器應該怎麼辦?
二進位制版本中自己帶有了最新的apache xerces2 xml解析器。如果你想用不同的相容jaxp的解析器,你可以移去ant庫目錄下的xercesimpl.jar和xml-apis.jar兩個檔案。你可以要用的解析器放到ant的庫目錄下,也可以把jars檔案放到系統的類路徑中。
1.配置
在環境變數中先配置ant_home = F:\sourceCode\apache-ant-1.8.0;
然後再path中新增%ant_home%\bin.到dos介面中輸入ant命令,如果出現build fail錯誤提示,說明設定成功。
2.執行
直接ant命令將開啟一個預設的構建檔案,即build.xml
如果要呼叫我們自己的構建檔案proj.xml,則需要鍵入以下命令:ant -buildfile proj.xml
還可以用一條命令顯示的執行多個target目標:
ant -buildfile proj.xml clean jar
(意思為執行proj.xml檔案中的clean和jar兩個target) ,如果不指定target命令,則執行預設的命令,預設的命令在<project name="mytest" default="complie" basedir=".">中的default屬性宣告。
3.幫助
有些target包括有description屬性,而另一些沒有。這是因為ant會區別主目標和子目標。包含有描述資訊的為主目標,沒有描述資訊的為子目標,兩者只是表達形式上有區別,功能上是完全相同的。你可以鍵入 ant -projecthelp檢視。
4.Ant的Core Tasks
4.1 File(Directory)類
4.1.1 Mkdir
建立一個目錄,如果他的父目錄不存在,也會被同時建立。
例子:
<mkdir dir="build/classes"/>
說明:如果build不存在,也會被同時建立
4.1.2 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>
4.1.3 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>
4.1.4 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>
4.2 Java相關
4.2.1 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"
/>
編譯{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"/>
<javac srcdir="{src}"
destdir="{src}"
classpath="{classpath}"
debug="on"
/>
路徑是在property中定義的
4.2.2 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 ...>
<classpath refid="project.class.path"/>
</rmic>
</target>
4.3打包相關
4.3.1 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檔案,而不是由系統生成
4.3.2 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
4.3.3 ear
用於打包企業應用
例子
<ear destfile="{build.dir}/myapp.ear" appxml="{src.dir}/metadata/application.xml">
<fileset dir="{build.dir}" includes="*.jar,*.war"/>
</ear>
4.4時間戳
在生成環境中使用當前時間和日期,以某種方式標記某個生成任務的輸出,以便記錄它是何時生成的,這經常是可取的。這可能涉及編輯一個檔案,以便插入一個字串來指定日期和時間,或將這個資訊合併到 JAR 或 zip 檔案的檔名中。
這種需要是通過簡單但是非常有用的 tstamp 任務來解決的。這個任務通常在某次生成過程開始時呼叫,比如在一個 init 目標中。這個任務不需要屬性,許多情況下只需 <tstamp/> 就足夠了。
tstamp 不產生任何輸出;相反,它根據當前系統時間和日期設定 Ant 屬性。下面是 tstamp 設定的一些屬性、對每個屬性的說明,以及這些屬性可被設定到的值的例子:
屬性說明例子
DSTAMP 設定為當前日期,預設格式為yyyymmdd 20031217
TSTAMP 設定為當前時間,預設格式為 hhmm 1603
TODAY 設定為當前日期,帶完整的月份2003 年 12 月 17 日
例如,在前一小節中,我們按如下方式建立了一個 JAR 檔案:
<jar destfile="package.jar" basedir="classes"/>
在呼叫 tstamp 任務之後,我們能夠根據日期命名該 JAR 檔案,如下所示:
<jar destfile="package-{DSTAMP}.jar" basedir="classes"/>
因此,如果這個任務在 2003 年 12 月 17 日呼叫,該 JAR 檔案將被命名為 package-20031217.jar。
還可以配置 tstamp 任務來設定不同的屬性,應用一個當前時間之前或之後的時間偏移,或以不同的方式格式化該字串。所有這些都是使用一個巢狀的 format 元素來完成的,如下所示:
<tstamp>
<format property="OFFSET_TIME"
pattern="HH:mm:ss"
offset="10" unit="minute"/>
</tstamp>
上面的清單將 OFFSET_TIME 屬性設定為距離當前時間 10 分鐘之後的小時數、分鐘數和秒數。
用於定義格式字串的字元與 java.text.SimpleDateFormat 類所定義的那些格式字元相同
4.5執行SQL語句
通過jdbc執行SQL語句
例子:
1.<sql
driver="org.gjt.mm.mysql.Driver"
url="jdbc:mysql://localhost:3306/mydb"
userid="root"
password="root"
src="data.sql"
/>
2.<sql
driver="org.database.jdbcDriver"
url="jdbc:database-url"
userid="sa"
password="pass"
src="data.sql"
rdbms="oracle"
version="8.1."
>
</sql>
只有在oracle、版本是8.1的時候才執行
4.6傳送郵件
使用SMTP伺服器傳送郵件
例子:
<mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build">
<from address="me@myisp.com"/>
<to address="all@xyz.com"/>
<message>The {buildname} nightly build has completed</message>
<fileset dir="dist">
<includes name="**/*.zip"/>
</fileset>
</mail>
mailhost: SMTP伺服器地址
mailport:伺服器埠
subject:主題
from:傳送人地址
to:接受人地址
message:傳送的訊息
fileset:設定附件
五、自定義TASK
ANT已經內建了不少task,像copy、replace、javac等等,但是有時候還需要一些特定的任務來完成操作,比如在生成JAD檔案時,需要一個Midlet-Jar-Size的引數,得到JAR檔案的大小,但是通過內部的task無法實現,因此可以自己編寫類來實現此功能,但必須保證該類是從Task類繼承過來的。
例:
<taskdef
name="filesize" classname="ant.FileSizeTask" classpath="${LIB_PATH}/FileSizeTask.jar" />
<filesize file="${Base}/Demo_Build/${jarName}" property="size" />
<replace dir="store" includes="${jadName}" encoding="UTF-8">
<replacefilter token="@FILESIZE@" value="${size}" />
</replace>
解釋:taskdef:自定義任務,name:任務名
編寫Ant 自定義任務很簡單,Ant 能夠使用生成檔案中指定的對應屬性的值來呼叫這個方法,這個方法的名稱需要是 set 加上屬性的名稱,因此在下面的例子中,我們需要名為 setFile() 和 setTofile() 的兩個方法。
當 Ant 遇到生成檔案中的一個屬性設定時,它會尋找相關任務中具有適當名稱的方法(稱為 setter 方法)。
生成檔案中的屬性是作為字串來指定的,因此我們的 setter 方法的引數可以是一個字串。在這樣的情況下,Ant 將在展開值所引用的任何屬性之後,使用該屬性的字串值來呼叫我們的方法。
但有時我們想把屬性的值看作是一種不同的型別。這裡的示例任務就是這種情況,其中的屬性值引用檔案系統上的檔案,而不只是引用任意的字串。可以通過將方法引數宣告為 java.io.File 型別來容易地做到這點。
Ant 將接受屬性的字串值,並把它解釋為一個檔案,然後傳遞給我們的方法。Ant 能夠對其他型別執行類似的轉換,比如 boolean 和 int 型別。但如果提供具有相同名稱但是具有不同引數的兩個方法,Ant 將使用更明確的那一個方法,因此檔案型別將優先於字串型別。
例:一個排序的task任務
public class FileSorter extends Task {
private File file, tofile;
// ant在進行任務處理時會呼叫execute()方法
public void execute() throws BuildException {
System.out.println("Sorting file="+file);
try {
BufferedReader from =
new BufferedReader(new FileReader(file));
BufferedWriter to =
new BufferedWriter(new FileWriter(tofile));
List allLines = new ArrayList();
// read in the input file
String line = from.readLine();
while (line != null) {
allLines.add(line);
line = from.readLine();
}
from.close();
// sort the list
Collections.sort(allLines);
// write out the sorted list
for (ListIterator i=allLines.listIterator(); i.hasNext(); ) {
String s = (String)i.next();
to.write(s); to.newLine();
}
to.close();
} catch (FileNotFoundException e) {
throw new BuildException(e);
} catch (IOException e) {
throw new BuildException(e);
}
}
// file引數
public void setFile(File file) {
this.file = file;
}
// tofile引數
public void setTofile(File tofile) {
this.tofile = tofile;
}
}
使用這個自定義任務:
<taskdef name="filesorter" classname=" FileSorter" classpath="filesorter"/>
<target name="main">
<filesorter file="input.txt" tofile="output.txt"/>
</target>
相關文章
- HTML常見標籤詳解HTML
- Git tag標籤用法詳解Git
- POM.xml 標籤詳解XML
- Go 結構體標籤詳解Go結構體
- Maven中optional標籤詳解(轉)Maven
- dedecms模板標籤dede:channelartlist詳解
- HTML5常見標籤詳解HTML
- HTML表單標籤詳解:如何用HTML標籤打造互動網頁?HTML網頁
- 常用的HTML標籤詳解與總結HTML
- maven中的scope標籤類別詳解Maven
- 標籤實現預載入功能詳解
- JavaScript物件導向修改標籤頁詳解JavaScript物件
- Html網頁中meta標籤及用法詳解HTML網頁
- <link>標籤實現預載入功能詳解
- script標籤的defer和async屬性詳解
- solidity註解標籤Solid
- HTML5標籤HTMLCollection和NodeList的區別詳解HTML
- Angular中innerHTML標籤的樣式不起作用詳解AngularHTML
- 解決img標籤與其它標籤間隙問題?
- PbootCMS詳情頁常見標籤呼叫boot
- properties標籤和typeAliases標籤
- HTML常用基礎標籤:圖片與超連結標籤全解!HTML
- Git應用詳解第八講:Git標籤、別名與Git gcGitGC
- PbootCMS模板內容詳情頁標籤呼叫boot
- 移動端的頭部標籤和meta,[html5]移動端的頭部標籤和meta屬性詳解HTML
- HTML標籤(基本標籤的使用)HTML
- 指標詳解指標
- VOC標籤轉化為YOLO標籤YOLO
- 好程式設計師web前端分享html中meta標籤及用法詳解程式設計師Web前端HTML
- 前端meta標籤內容定義及使用說明,meta詳細說明,meta標籤使用前端
- 一文詳解阿里雲可觀測體系下標籤最佳實踐阿里
- HTML <a> 標籤HTML
- html標籤HTML
- Git 標籤Git
- base標籤
- JSTL標籤JS
- 影像處理技術:影像切割、標籤、貼紙花字,超細開發詳解
- Apache官網下載ant軟體包及安裝詳解Apache
- K8S標籤與標籤選擇器K8S