[doc] ant常用task
主要內容
1. 常用task(這是很主觀的xd)
:: mkdir
:: copy
:: delete
:: move
:: javac
:: echo
:: java
2. 執行class
3. target相依性
行前講習
* 在一些稍具模規的project大致上都會把source directory
和output directory分開,output directory也許是lib也許是bin
沒有一定的。要達到這些目的,在ant中提供了幾個task能幫得上忙。
(copy. move. delete. mkdir)
* 一個project可能有多許`組`程式,你可以為這些程式分別撰寫個自的target
但是,有些target必需限制在某些target之後執行。這問題就需要利用
target的相依屬性(depends)來設定了:)
重新規劃nice project
project basedir
/
src/
bin/
build.xml
我們重新規劃project如上述目錄結構:)所以,我們這回把*.java放在src
之中。產生出的*.class則放在bin之中。但我並不打算自己建立bin dir
build.xml (原先的)
----------------------------------------------------------------------
slayer@ubuntu:~/test/anttest$ ls
build.xml src
slayer@ubuntu:~/test/anttest$ cat build.xml
<?xml version="1.0" encoding="utf-8" ?>
<project name="nice" basedir=".">
<property name="src.dir" value="."/>
<target name="i-need-kitty"
description="just get me a hello kitty">
<echo>Kitty Kitty</echo>
<javac srcdir="${src.dir}" />
</target>
</project>
build.xml (指定src) :: 如之前介紹的,更改src.dir變數內容即可:)
----------------------------------------------------------------------
slayer@ubuntu:~/test/anttest$ cat build.xml
<?xml version="1.0" encoding="utf-8" ?>
<project name="nice" basedir=".">
<property name="src.dir" value="src"/>
<target name="i-need-kitty"
description="just get me a hello kitty">
<echo>Kitty Kitty</echo>
<javac srcdir="${src.dir}" />
</target>
</project>
slayer@ubuntu:~/test/anttest$ ant i-need-kitty
Buildfile: build.xml
i-need-kitty:
[echo] Kitty Kitty
BUILD SUCCESSFUL
Total time: 1 second
slayer@ubuntu:~/test/anttest$ ls -l src/
總計 8
-rw-r--r-- 1 slayer slayer 340 2006-04-08 13:02 HelloKitty.class
-rw-r--r-- 1 slayer slayer 108 2006-04-08 08:26 HelloKitty.java
slayer@ubuntu:~/test/anttest$
===================================================================
結果發現,編譯好的class檔跑到src內了。所以我們還需要再修改一下
build.xml來符合我們所期待的結果。為了達成我們的目的,有幾種改變的方式
你可以在i-need-kitty的target中,直接使用mkdir等相關的task。
或是把建立bin directory獨立為一個target。
build.xml :: 採用在i-need-kitty加上move的動作
http://ant.apache.org/manual/CoreTasks/move.html
----------------------------------------------------------------------
slayer@ubuntu:~/test/anttest$ cat build.xml
<?xml version="1.0" encoding="utf-8" ?>
<project name="nice" basedir=".">
<property name="src.dir" value="src"/>
<property name="bin.dir" value="bin"/>
<target name="i-need-kitty"
description="just get me a hello kitty">
<echo>Kitty Kitty</echo>
<javac srcdir="${src.dir}" />
<move todir="${bin.dir}">
<fileset dir="${src.dir}">
<include name="*.class" />
</fileset>
</move>
</target>
</project>
執行i-need-kitty
----------------------------------------------------------------------
slayer@ubuntu:~/test/anttest$ ant i-need-kitty
Buildfile: build.xml
i-need-kitty:
[echo] Kitty Kitty
[javac] Compiling 1 source file
[move] Moving 1 file to /home/slayer/test/anttest/bin
BUILD SUCCESSFUL
Total time: 2 seconds
觀察結果,確實是我們期待的那樣:)
----------------------------------------------------------------------
slayer@ubuntu:~/test/anttest$ ls -l *
-rw-r--r-- 1 slayer slayer 585 2006-04-08 13:18 build.xml
bin:
總計 4
-rw-r--r-- 1 slayer slayer 340 2006-04-08 13:19 HelloKitty.class
src:
總計 4
-rw-r--r-- 1 slayer slayer 108 2006-04-08 08:26 HelloKitty.java
======================================================================
細心的人一定發現了。我們並沒有mkdir:) 這大概算move的特異功能xd
沒有先mkdir出來。它就幫你自動mkdir了。
接著那編好了之後,能不能執行來跑看看呢? 這當然也是一個ez job
首先,先讓我招喚一下error message:)
build.xml :: 含java HelloKitty
----------------------------------------------------------------------
slayer@ubuntu:~/test/anttest$ cat build.xml
<?xml version="1.0" encoding="utf-8" ?>
<project name="nice" basedir=".">
<property name="src.dir" value="src"/>
<property name="bin.dir" value="bin"/>
<target name="i-need-kitty"
description="just get me a hello kitty">
<echo>Kitty Kitty</echo>
<javac srcdir="${src.dir}" />
<move todir="${bin.dir}">
<fileset dir="${src.dir}">
<include name="*.class" />
</fileset>
</move>
</target>
<target name="kitty">
<java classname="HelloKitty" />
</target>
</project>
slayer@ubuntu:~/test/anttest$ ant kitty
Buildfile: build.xml
kitty:
[java] Could not find HelloKitty. Make sure you have it in your
classpath
[java] at
org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:170)
[java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:710)
[java] at
org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:178)
[java] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:84)
[java] at
org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[java] at org.apache.tools.ant.Task.perform(Task.java:364)
[java] at org.apache.tools.ant.Target.execute(Target.java:341)
[java] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[java] at
org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[java] at
org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[java] at
org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[java] at
org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[java] at org.apache.tools.ant.Main.runBuild(Main.java:668)
[java] at org.apache.tools.ant.Main.startAnt(Main.java:187)
[java] at
org.apache.tools.ant.launch.Launcher.run(Launcher.java:246)
[java] at
org.apache.tools.ant.launch.Launcher.main(Launcher.java:67)
BUILD SUCCESSFUL
Total time: 0 seconds
======================================================================
別害怕錯誤訊息太多。通常看第一個發生的錯誤就是了。如果不確定,
就找與你自己的程式有關的部分來看就好。其他package產生的錯誤只是連帶而來:)
<%
Could not find HelloKitty.
Make sure you have it in your classpath
%>
所以,直覺就是沒有為java屬性加上classpath:
<%
<java classname="HelloKitty" classpath="${bin.dir}" />
%>
再次執行:
----------------------------------------------------------------------
slayer@ubuntu:~/test/anttest$ ant kitty
Buildfile: build.xml
kitty:
[java] Get Hello Kitty atSat Apr 08 13:45:39 CST 2006
BUILD SUCCESSFUL
Total time: 0 seconds
======================================================================
雖然,到目前為止看起來是正常的。但是我們忽略了執行順序的問題。如果沒有
先執行i-need-kitty就會發生問題。同樣地,我們砍除bin來招喚出error message
來欣賞一下^^
<%
slayer@ubuntu:~/test/anttest$ rm -rf bin
slayer@ubuntu:~/test/anttest$ ant kitty
Buildfile: build.xml
kitty:
[java] Could not find HelloKitty. Make sure you have it in your
classpath
................................................後面同上:)
%>
你會發現這和沒有寫classpath的error message是相同的。
所以,當發生這種error message時,您必需檢查這二種情況:)
言歸正傳,我們還是要用target提供的depends屬性來做簡單的處理:
<%
<target name="kitty" depends="i-need-kitty">
%>
再次執行
----------------------------------------------------------------------
slayer@ubuntu:~/test/anttest$ ant kitty
Buildfile: build.xml
i-need-kitty:
[echo] Kitty Kitty
[javac] Compiling 1 source file
[move] Moving 1 file to /home/slayer/test/anttest/bin
kitty:
[java] Get Hello Kitty at Sat Apr 08 13:53:17 CST 2006
BUILD SUCCESSFUL
Total time: 1 second
======================================================================
大致上,ant基本就是這些功能嚕:)
看倌可以自行實作2個target
1. usage: 用echo顯示訊息
2. clean: 用delete刪除bin
PS. 本篇將相依、classpath的問題過於簡化:)
有興趣的朋友可以上網找相關文章 :)
--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知止可以 pc210-59-94-148.nutn.edu.tw海
作者在 06/04/08 12:39:21 從 pc210-59-94-148.nutn.edu.tw 修改這篇文章
作者在 06/04/08 13:29:04 從 pc210-59-94-148.nutn.edu.tw 修改這篇文章
作者在 06/04/08 13:32:22 從 pc210-59-94-148.nutn.edu.tw 修改這篇文章
作者在 06/04/08 13:46:48 從 pc210-59-94-148.nutn.edu.tw 修改這篇文章
作者在 06/04/08 13:56:49 從 pc210-59-94-148.nutn.edu.tw 修改這篇文章
作者在 06/04/08 13:58:50 從 pc210-59-94-148.nutn.edu.tw 修改這篇文章
作者在 06/04/08 13:59:09 從 pc210-59-94-148.nutn.edu.tw 修改這篇文章
討論串 (同標題文章)
完整討論串 (本文為第 1 之 3 篇):
java 近期熱門文章
PTT數位生活區 即時熱門文章