編譯
Java
代碼的任務(wù)的編寫方式:
??????????????? <javac srcdir="src"/>
這個(gè)標(biāo)簽尋找
src
目錄中以
.java
為擴(kuò)展名的所有文件,并對它們調(diào)用
javac
編譯器,從而在相同的目錄中生成類文件。當(dāng)然,將類文件放在一個(gè)單獨(dú)的目錄結(jié)構(gòu)中通常會更清晰;可以通過添加
destdir
屬性來讓
Ant
做到這點(diǎn)。其他有用的屬性包括:
classpath :等價(jià)于 javac 的 -classpath 選項(xiàng)。
debug="true" :指示編譯器應(yīng)該帶調(diào)試信息編譯源文件。
javac 任務(wù)的一個(gè)重要特點(diǎn)在于,它僅編譯那些它認(rèn)為需要編譯的源文件。如果某個(gè)類文件已經(jīng)存在,并且對應(yīng)的源文件自從該類文件生成以來還沒有改變過,那么該源文件就不會被重新編譯。 javac 任務(wù)的輸出顯示了實(shí)際被編譯的源文件的數(shù)目。編寫一個(gè) clean 目標(biāo)來從目標(biāo)目錄移除生成的任何類文件是個(gè)很好的習(xí)慣。如果想要確保所有源文件都已編譯,就可以使用這個(gè)任務(wù)。這種行為刻畫了 Ant 的許多任務(wù)的特點(diǎn):如果某個(gè)任務(wù)能夠確定所請求的操作不需要執(zhí)行,那么該操作就會被跳過。
Ant 的 javac 任務(wù)的默認(rèn)行為是調(diào)用運(yùn)行 Ant 本身的任何 JVM 的標(biāo)準(zhǔn)編譯器。然而,有時(shí)您可能想要單獨(dú)地調(diào)用編譯器 —— 例如當(dāng)你希望指定編譯器的某些內(nèi)存選項(xiàng),或者需要使用一種不同級別的編譯器的時(shí)候。為實(shí)現(xiàn)這個(gè)目的,只需將 javac 的 fork 屬性設(shè)置為 true ,比如像下面這樣:
<javac srcdir="src" fork="true"/>
如果想要指定一個(gè)不同的 javac 可執(zhí)行文件,并向它傳遞一個(gè)最大內(nèi)存設(shè)置,可以像下面這樣做:
??? <javac srcdir="src" fork="true" executable="d:\sdk141\bin\javac"
memoryMaximumSize="<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="128" unitname="m">128m</chmetcnv>"/>
在編譯 Java 源文件之后,結(jié)果類文件通常被打包到一個(gè) JAR 文件中,這個(gè)文件類似 zip 歸檔文件。每個(gè) JAR 文件都包含一個(gè)清單文件,它可以指定該 JAR 文件的屬性。
下面是 Ant 中 jar 任務(wù)的一個(gè)簡單使用例子:
<jar destfile="package.jar" basedir="classes"/>
這將創(chuàng)建一個(gè)名為 package.jar 的 JAR 文件,并把 classes 目錄中的所有文件添加到其中( JAR 文件能夠包含任意類型的文件,而不只是類文件)。此處沒有指定清單文件,因此 Ant 將提供一個(gè)基本的清單文件。
manifest 屬性允許指定一個(gè)用作該 JAR 文件的清單的文件。清單文件的內(nèi)容還可以使用 manifest 任務(wù)在生成文件中指定。這個(gè)任務(wù)能夠像文件系統(tǒng)寫入一個(gè)清單文件,或者能夠?qū)嶋H嵌套在 jar 之內(nèi),以便一次性地創(chuàng)建清單文件和 JAR 文件。 例如:







在生成環(huán)境中使用當(dāng)前時(shí)間和日期,以某種方式標(biāo)記某個(gè)生成任務(wù)的輸出,以便記錄它是何時(shí)生成的,這經(jīng)常是可取的。這可能涉及編輯一個(gè)文件,以便插入一個(gè)字符串來指定日期和時(shí)間,或?qū)⑦@個(gè)信息合并到 JAR 或 zip 文件的文件名中。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
?
這種需要是通過簡單但是非常有用的 tstamp 任務(wù)來解決的。這個(gè)任務(wù)通常在某次生成過程開始時(shí)調(diào)用,比如在一個(gè) init 目標(biāo)中。這個(gè)任務(wù)不需要屬性,許多情況下只需 <tstamp/> 就足夠了。
在調(diào)用 tstamp 任務(wù)之后,我們能夠根據(jù)日期命名該 JAR 文件,如下所示:
<jar destfile="package-${DSTAMP}.jar" basedir="classes"/>
因此,如果這個(gè)任務(wù)在 2006 年 3 月 8 日調(diào)用,該 JAR 文件將被命名為 package-20060308.jar
還可以配置 tstamp 任務(wù)來設(shè)置不同的屬性,應(yīng)用一個(gè)當(dāng)前時(shí)間之前或之后的時(shí)間偏移,或以不同的方式格式化該字符串。所有這些都是使用一個(gè)嵌套的 format 元素來完成的,如下所示:






上面的清單將 OFFSET_TIME 屬性設(shè)置為距離當(dāng)前時(shí)間 10 分鐘之后的小時(shí)數(shù)、分鐘數(shù)和秒數(shù)。
用于定義格式字符串的字符與 java.text.SimpleDateFormat 類所定義的那些格式字符相同。
下面將把這些代碼片斷組合成一個(gè)完整的生成文件,它將編譯
src
目錄下的所有源代碼,將結(jié)果類文件放在
build
目錄下,然后把所有類文件打包到
dist
目錄中的一個(gè)
JAR
文件中。要自己試驗(yàn)這個(gè)生成文件,您所需要的就是包含一個(gè)或多個(gè)
Java
源代碼文件的
src
目錄 —— 這個(gè)目錄可以包含從簡單的“
Hell World
”程序到來自某個(gè)現(xiàn)有項(xiàng)目的大量源文件的任何內(nèi)容。如果需要向
Java classpath
添加
JAR
文件或其他任何內(nèi)容,以便成功地編譯源代碼,您只需在
javac
任務(wù)中為其添加一個(gè)
classpath
屬性:


































下面是使用該文件執(zhí)行的某次生成過程的示例輸出(您得到的輸出可能不一樣,具體取決于 src 目錄的內(nèi)容):
















注意 JAR 文件是根據(jù)當(dāng)前日期來命名的,并且為應(yīng)用程序的主類設(shè)置了一個(gè)清單條目,以便主類能夠通過一個(gè)簡單的命令 java -jar package-20031217.jar 來直接運(yùn)行。我們還創(chuàng)建了一個(gè) JAR 文件,它僅包含項(xiàng)目的源代碼。
?
?
?
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
