ant編譯泛型
㈠ Eclipse中報錯的解決方案
Eclipse中報錯 要了解詳細信息 請使用 xlint:unchecked重新編譯 的解決方案 一 遇到問題 用ant執行jasperreport的samplescharts示例的build xml時 無法編譯 提示錯誤如下 javac:[javac]Compiling sourcefilestoE:jiangcmworkspace forict [javac]注意 E:jiangcmworkspace forict ChartsApp java使用了未經檢查或不安全的操作 [javac]注意 要了解詳細信息 請使用 Xlint:unchecked重新編譯 二 查了一下資料 知道是泛型的原因 網上查到的解決方案主要有以下幾種 編譯時帶上參數 source 使用@SupressWarnings( unchecked )注釋 更新你的代碼 使用List<Object> List<Object>的實例能接受任何類型的對象 就像是一個原型List 然而 編譯器不會報錯 (以上三種方法來源 l) 如果你用的Ant 使用build xml編譯的話 可以右擊宴鎮build xml文件 >執行 >構成和執行 選擇參數 在《程序參數》裡面輸入 xlint:unchecked即可; 找到build xml裡面類似的語句 加上一句話 <! JavaCompile ><targetname= pile depends= init ><javacsrcdir= src destdir= ${classdir} deprecation= on encoding= Windows J debug= on includes= **/jp/** ><pilerargvalue= Xlint:unchecked />`<! 就是這句話!! ><classpathrefid= project class path /></javac></target>(以上兩種方法來源 ) 三 自己的試驗與結論 第一種 編譯時帶上參數 source 使用方法 找到build xml裡面類似的語句 加上一句話 <javacsrcdir= ${src dir} destdir= ${classes dir} ><classpathrefid= classpath /><pilerargline= source />`<! 就是這句話!注意與第五種方式不同的是line標簽而不是value! ></javac>編譯通局談過 charts下的報表出現了!第二種 使用@SupressWarnings( unchecked )注釋 在ChartsApp java的main函數前加上了這個注釋 但是沒有起作用 提示錯誤依然是 [javac]注意 要了解詳細信息 請使用 Xlint:unchecked重新編譯 怎麼回事呢?在一篇文章中找到了答案 l在撰寫本文時候 javac並不支持@SuppressWarnings的註解 期望在Java 中得到支持 晌臘粗第三種 更改代碼為泛型使用方式 原來的代碼 Mapparameters=newHashMap();parameters put( MaxOrderID newInteger( ));更改後的代碼 Map<String Integer>parameters=newHashMap<String Integer>();parameters put( MaxOrderID newInteger( ));或者 Map<Object Object>parameters=newHashMap<Object Object>();parameters put( MaxOrderID newInteger( ));更改後 順利通過編譯 也能看到報表了!!第四種 經驗證無效 第五種 <javacsrcdir= src destdir= ${classdir} deprecation= on encoding= Windows J debug= on includes= **/jp/** ><pilerargvalue= Xlint:unchecked />`<! 就是這句話!! ><classpathrefid= project class path /></javac>加上 <pilerargvalue= Xlint:unchecked /> 後 出現 警告 不過編譯順利通過 也能看到報表了!編譯提示如下 [javac]Compiling sourcefilestoE:jiangcmworkspace forict [javac]E:jiangcmworkspace forict ChartsApp java: :警告 [unchecked]對作為普通類型java util Map的成員的put(K V)的調用未經檢查[javac]parameters put( MaxOrderID newInteger( ));[javac]^[javac] 警告呵呵 答案是豐富多彩的 條條大道通羅馬 這次不僅解決了問題 還找到了四種解決問題的方法 參考資料 J SE 中的泛型作者 BudiKurniawanl Eclipse中報jsp中有錯誤 要了解詳細信息 請使用 xlint:unchecked重新編譯 具體在菜單上怎麼操作? 泛型類型 第一部分作者:DavidFlanaganl 有關ant的faqQ Howtopass Xlintor Xlint:uncheckedto javactask?A:passitaspilerargnested<pilerarg>tospecify <pilerargvalue= Xlint /><! or ><pilerargvalue= Xlint:unchecked /> lishixin/Article/program/Java/ky/201311/28243
㈡ ant是什麼意思 解析ant的含義和用法
在Java項目中,Ant通常用於構建、編譯、打包和部署,具體的使用方法如下:
4. 部署:Ant可以自動部署Java應用程序,支持多種部署方式,如FTP、SSH、SCP等。
Ant的使用方法非常簡單,只需要編寫一個Ant腳本文件(通常是build.xml),然後使用Ant命令運行即可。Ant的腳本文念笑櫻件主要由一系列任務(Task)組成,每個任務都是一個獨立的操作單元,可以完成不同的構建任務。Ant提供了很多內置任務,如編譯Java代碼、打包成JAR文件、生成文檔等,同時也支持自定義任務,可以根據項目需要編寫自己的任務。
3. 打包:Ant可以將Java代碼打包成JAR文件、WAR文件等,可以指定打包的文件名、文件路徑、文件類型等。
Ant的使用方法非常簡單,只需要編寫一個Ant腳本文件(通常是build.xml),然後使用Ant命令運行即可。Ant的腳本文件主要由一系列任務(Task)組成,每個任務都是一個獨立的操作單元,可以完成不同的構建任務。Ant提供了很多內置任務,如編譯Java代碼、打包成JAR文件、生成文檔等,同時也升羨支持自定義任務,可以根據項目需要編寫自己的任務。
4. 部署:Ant可以自動部署Java應用程序,支持多種部署方式,如FTP、仔叢SSH、SCP等。
㈢ ant 打包編譯過程報錯:不兼容的類型
說明源文件有的不 是utf-8編碼的,應該修改源文件的編碼。。。。。。。。。。。。
Haskell
㈣ 如何使用ANT在命令行進行編譯和測試
一、環境變數
在網上找到ANT的壓縮包,解壓縮以後放到C盤根目錄如下圖
對,就是這個鬼樣子,放在這里就可以用了,不用安裝之類的
環境變數如下圖:
你要定義ANT_HOME,然後讓系統path找到這個ANT_HOME就行了
二、寫build.xml
你的目錄結構如下圖:
源文件 放在src
引用的jar包放在lib
編譯結果安排在classes
接下來就是build.xml了
如下,自己看吧
[html] view plain
<?xml version="1.0"?>
<project name="pojo_0428" default="prepare" basedir=".">
<property name="source.root" value="src"/>
<property name="class.root" value="classes"/>
<property name="lib.dir" value="lib"/>
<!-- class path for compilation and execution -->
<path id="basepath">
<!-- 運行時 class文件的位置 -->
<pathelement location="${class.root}" />
<!-- jar包 -->
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
</path>
<!--默認的target -->
<target name="prepare">
<delete dir="${class.root}"/>
<mkdir dir="${class.root}"/>
</target>
<!--編譯 -->
<target name="compile" depends="prepare">
<javac srcdir="${source.root}"
destdir="${class.root}"
debug="on"
optimize="off"
deprecation="on">
<classpath refid="basepath"/>
</javac>
</target>
<!--執行。 案常式序的入口 依賴 compile -->
<target name="run" depends="compile">
<java classname="com.javathink.Student" fork="true">
<classpath refid="basepath"/>
</java>
</target>
</project>
㈤ ant編譯build.xml文件
折騰了大半天,可算搗騰出來了,這里需要提醒注意如下幾點:
1、如果jdk是1.6及以下,則需要使用的ant版本是1.9.x;
2、如果jdk是1.8,則需要使用ant版本是1.10.x;
3、可用eclipse導出war包,將lib目錄下的jar包放到一個目錄下,然後直接引用,避免遺漏掉jar包沒導入進去。
以下是build.xml文件內容,安裝好ant後,直接執行ant build.xml即可打包。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 定義一個工程,默認任務為warFile。 -->
<project name="bing-info" default="warFile" basedir=".">
<!-- 指定jdk 貌似這里指定也沒什麼用~-->
<property name="env.JAVA_HOME" value="C:/Program Files/Java/jdk1.8.0_101"/>
<!-- 定義屬性,打成war包的名稱。 -->
<property name="warFileName" value="nbAPP.war"></property>
<!-- 指定war包路徑及依賴包路徑 這里需要指定工程的路徑 -->
<property name="compilePath" value="D:/project/nbAPP"/>
<!-- 定義路徑,編譯java文件時用到的jar包。 -->
<path id="project.lib">
<fileset dir="${basedir}/lib">
<include name="**/*.jar"/>
</fileset>
</path>
<!-- 定義任務,清空任務:清空原有的class文件,創建新的build路徑。 -->
<target name="clean">
<delete dir="${compilePath}/build" />
<mkdir dir="${compilePath}/build" />
</target>
<!-- 定義任務,編譯src文件夾中的java文件,編譯後的class文件放到創建的文件夾下。 -->
<target name="compile" depends="clean">
<javac srcdir="${basedir}/src/main" debug="true" includeantruntime="false" encoding="UTF-8" >
<classpath refid="project.lib">
</classpath>
</javac>
</target>
<!-- 定義默認任務,將class文件集合成jar包。 -->
<target name="warFile" depends="compile">
<!-- 刪除原有war包。 -->
<delete dir="${compilePath}/${warFileName}" />
<!-- 建立新war包。 -->
<war destfile="${compilePath}/${warFileName}" webxml="${basedir}/WebRoot/WEB-INF/web.xml">
<!-- 將非jar和非class文件拷貝到war包的對應路徑下。 -->
<fileset dir="${basedir}/WebRoot">
<include name="**/**.*" />
<exclude name="**/*.jar"/>
<include name="WEB-INF/classes/**"/>
</fileset>
<!-- 將jar和class文件拷貝到war包的對應路徑下。 -->
<lib dir="${compilePath}/lib" />
<classes dir="${compilePath}/build" />
<!-- 將資源文件拷貝進war對應路徑下 -->
<classes dir="${basedir}/src/main/resources" />
</war>
</target>
</project>
㈥ Java升級篇:ANT十五大最佳實踐詳解
在Ant出現之前 構建和部署Java應用需要使用包括特定平台的腳本 Make文件 各種版本的IDE甚至手工操作的 大雜燴 現在 幾乎所有的開源Java項目都在使用Ant 大多數襲消手公司的內部項目也在使用Ant Ant在這些項目中的廣泛使用自然導致了讀者對一整套Ant最佳實踐的迫切需求 本文總結了我喜愛的Ant技巧或最佳實踐 多數是從我親身經歷的項目錯誤或我聽說的其他人經歷的 恐怖 故事中得到靈感的 比如 有人告訴我有個項目把XDoclet 生成的代碼放入帶有鎖定文件功能的版本控制工具中 當開發者修改源代碼時 他必須記住手工檢出(Check out)並鎖定所有將要重新生成的文件 然後 手工運行代碼生成器 只到這時他才能夠讓Ant編譯代碼 這一方法還存在如下一些問題 生成的代碼無法存儲在版本控制系統中 Ant(本案例中是Xdoclet)應該自動確定下一次構建涉及的源文件 而不應由程序員手工確定 Ant的構建文件應該定義好正確的任務依賴關系 這樣程序員就不必為了完成構建而不得不按照特定順序調用任務 當我開始一個新項目時 我首先編寫Ant構建文件 Ant文件明確地定義構建的過程 並被團隊中的每個程序員使用 本文所列的技巧基於這樣的假定 Ant構建文件是一個必須仔細編寫的重要文件 它應在版本控制系統中得到維護 並被定期進行重構 下面是我的十五大Ant最佳實踐 採用一致的編碼規范 Ant用戶有的喜歡有橋輪的痛恨其構建文件的XML語法 與其跳進這一令人迷惑的爭論中 不如讓我們先看一些能保持XML構建文件簡潔的方法 首先也是最重要的 花費時間格式化你的XML讓它看上拍嫌去很清晰 不論XML是否美觀 Ant都可以工作 但是醜陋的XML很難令人讀懂 倘若你在任務之間留出空行 有規則的縮進 每行文字不超過 列左右 那麼XML令人驚訝地易讀 再加上使用能夠高亮XML語法的優秀編輯器或IDE工具 你就不會有閱讀的麻煩 同樣 精選含意明確 容易讀懂的詞彙來命名任務和屬性 比如 dir reports就比rpts好 特定的編碼規范並不重要 只要拿出一套規范並堅持使用就行 將build xml放在項目根目錄中 Ant構建文件build xml可以放在任何位置 但是放在項目頂級目錄中可以保持項目簡潔 這是最常用的規范 開發者能夠在頂級目錄中找到預期的build xml 把構建文件放在根目錄中 也能夠使人容易了解項目目錄樹中不同目錄之間的邏輯關系 以下是一個典型的項目目錄層次 [root dir]| build xml+ src+ lib (包含第三方 JAR包)+ build (由 build任務生成)+ dist (由 build任務生成)當build xml在頂級目錄時 假設你處於項目某個子目錄中 只要輸入 ant find pile 命令 不需要改變工作目錄就能夠以命令行方式編譯代碼 參數 find告訴Ant尋找存在於上級目錄中的build xml並執行 使用單一的構建文件 有人喜歡將一個大項目分解成幾個小的構建文件 每個構建文件分擔整個構建過程的一小部分工作 這確實是看法不同的問題 但是應該認識到 將構建文件分割會增加對整體構建過程的理解難度 要注意在單一構建文件能夠清楚表現構建層次的情況下不要過工程化(over engineer) 即使你把項目劃分為多個構建文件 也應使程序員能夠在項目根目錄下找到核心build xml 盡管該文件只是將實際構建工作委派給下級構建文件 也應保證該文件可用 提供良好的幫助說明 應盡量使構建文件自文檔化 增加任務描述是最簡單的方法 當你輸入ant projecthelp時 你就可以看到帶有描述的任務清單 比如 你可以這樣定義任務 <target name= pile description= Compiles code output goes to the build dir >最簡單的規則是把所有你想讓程序員通過命令行就可以調用的任務都加上描述 對於一般用來執行中間處理過程的內部任務 比如生成代碼或建立輸出目錄等 就無法使用描述屬性 這時 可以通過在構建文件中加入XML注釋來處理 或者專門定義一個help任務 當程序員輸入ant help時來顯示詳細的使用說明 <target name= help description= Display detailed usage information ><echo>Detailed help </echo></target> 提供清除任務 每個構建文件都應包含一個清除任務 用來刪除所有生成的文件和目錄 使系統回到構建文件執行前的初始狀態 執行清空任務後還存在的文件都應處在版本控制系統的管理之下 比如 <target name= clean description= Destroys allgenerated files and dirs ><delete dir= ${dir build} /><delete dir= ${dir dist} /></target>除非是在產生整個系統版本的特殊任務中 否則不要自動調用clean任務 當程序員僅僅執行編譯任務或其他任務時 他們不需要構建文件事先執行既令人討厭又沒有必要的清空任務 要相信程序員能夠確定何時需要清空所有文件 使用ANT管理任務從屬關系 假設你的應用由Swing GUI組件 Web界面 EJB層和公共應用代碼組成 在大型系統中 你需要清晰地定義每個Java包屬於系統的哪一層 否則任何一點修改都要被迫重新編譯成百上千個文件 糟糕的任務從屬關系管理會導致過度復雜而脆弱的系統 改變GUI面板的設計不應造成Servlet和EJB的重編譯 當系統變得龐大後 稍不注意就可能將依賴於客戶端的代碼引入到服務端 這是因為典型的IDE項目文件編譯任何文件都使用單一的classpath 而Ant能讓你更有效地控制構建活動 設計你的Ant構建文件編譯大型項目的步驟 首先 編譯公共應用代碼 將編譯結果打成JAR包文件 然後 編譯上一層的項目代碼 編譯時依靠第一步產生的JAR文件 不斷重復這一過程 直到最高層的代碼編譯完成 分步構建強化了任務從屬關系管理 如果你工作在底層Java框架上 偶然引用到高層的GUI模板組件 這時代碼不需要編譯 這是由於構建文件在編譯底層框架時在源路徑中沒有包含高層GUI面板組件的代碼 定義並重用文件路徑 如果文件路徑在一個地方一次性集中定義 並在整個構建文件中得到重用 那麼構建文件更易於理解 以下是這樣做的一個例子 <project name= sample default= pile basedir= ><path id= mon ><pathelementlocation= ${jdom jar withpath} /> etc</path><path id= classpath client ><pathelement location= ${guistuff jar withpath} /><pathelement location= ${another jar withpath} /><! reuse the mon classpath ><path refid= mon /></path><target name= mon depends= prepare ><javac destdir= ${dir build} srcdir= ${dir src} ><classpathrefid= mon /><includename= /oreilly/mon/** /></javac></target></project>當項目不斷增長構建日益復雜時 這一技術越發體現出其價值 你可能需要為編譯不同層次的應用定義各自的文件路徑 比如運行單元測試的 運行應用程序的 運行Xdoclet的 生成JavaDocs的等等不同路徑 這種組件化路徑定義的方法比為每個任務單獨定義路徑要優越得多 否則 很容易丟失任務從屬關系的軌跡 定義恰當的任務從屬關系 假設dist任務從屬於jar任務 那麼哪個任務從屬於pile任務哪個任務從屬於prepare任務呢?Ant構建文件最終定義了任務的從屬關系圖 它必須被仔細地定義和維護 應該定期檢查任務的從屬關系以保證構建工作得到正確執行 大的構建文件隨著時間推移趨向於增加更多的任務 所以到最後可能由於不必要的從屬關系導致構建工作非常困難 比如 你可能發現在程序員只需編譯一些沒有使用EJB的GUI代碼時又重新生成了EJB代碼 以 優化 的名義忽略任務的從屬關系是另一種常見的錯誤 這種錯誤迫使程序員為了得到恰當的結果必須記住並按照特定的順序調用一串任務 更好的做法是 提供描述清晰的公共任務 這些任務包含正確的任務從屬關系 另外提供一套 專家 任務讓你能夠手工執行個別的構建步驟 這些任務不提供完整的構建過程 但是讓那些專家用戶在快速而惱人的編碼期間能夠跳過某些步驟 使用屬性 任何需要配置或可能發生變化的信息都應作為Ant屬性定義下來 對於在構建文件中多次出現的值也同樣處理 屬性既可以在構建文件頭部定義 也可以為了更好的靈活性而在單獨的屬性文件中定義 以下是在構建文件中定義屬性的樣式 <project name= sample default= pile basedir= ><property name= dir build value= build /><property name= dir src value= src /><property name= jdom home value= /java tools/jdom b /><property name= jdom jar value= jdom jar />< lishixin/Article/program/Java/ky/201311/28340
㈦ 使用Ant在編譯java類的時候出現以下錯誤,請問是什麼原因呢應該如何解決
泛型類型,javac編譯出錯,加-source1.5
泛型從1.5以後開始有C:>javac
用法:javac<options><sourcefiles>
其中,可能的選項包括:
-g生成所有調試信息
-g:none不生成任何調試信息
-g:{lines,vars,source}只生成某些調試信息
-nowarn不生成任何警告
-verbose輸出有關編譯器正在執行的操作的消息
-deprecation輸出使用已過時的API的源位置
-classpath<路徑>指定查找用戶類文件和注釋處理程序的位置
-cp<路徑>指定查找用戶類文件和注釋處理程序的位置
-sourcepath<路徑>指定查找輸入源文件的位置
-bootclasspath<路徑>覆蓋引導類文件的位置
-extdirs<目錄>覆蓋所安裝擴展的位置
-endorseddirs<目錄>覆蓋簽名的標准路徑的位置
-proc:{none,only}控制是否執行注釋處理和/或編譯。
-processor<class1>[,<class2>,<class3>...]要運行的注釋處理程序的名稱;繞過默認的搜索進程
-processorpath<路徑>指定查找注釋處理程序的位置
-parameters生成元數據以用於方法參數的反射
-d<目錄>指定放置生成的類文件的位置
-s<目錄>指定放置生成的源文件的位置
-h<目錄>指定放置生成的本機標頭文件的位置
-implicit:{none,class}指定是否為隱式引用文件生成類文件
-encoding<編碼>指定源文件使用的字元編碼
-source<發行版>提供與指定發行版的源兼容性
-target<發行版>生成特定VM版本的類文件
-profile<配置文件>請確保使用的API在指定的配置文件中可用
-version版本信息
-help輸出標准選項的提要
-A關鍵字[=值]傳遞給注釋處理程序的選項
-X輸出非標准選項的提要
-J<標記>直接將<標記>傳遞給運行時系統
-Werror出現警告時終止編譯
@<文件名>從文件讀取選項和文件名
㈧ 如何使用Ant來編譯Java文件以及如何運行
一、源文件情況
源文件位置為:D:\temp,源文件名(含包名字):com.ldq.WeatherDemo.java
前提:已安裝 jdk ,並配置好環境變數。
二、過程
1、編譯:
提示符進入 D:\temp 路徑下,輸入:javac com\ldq\WeatherDemo.java
生成類文件:WeatherDemo.class
2、打包:
提示符進入 D:\temp 路徑下,輸入:jar cvf WeatherDemo.jar com\ldq\WeatherDemo.class
生成檔案文件:WeatherDemo.jar
3、修改 MANIFEST.MF 文件:
由於引用了外部的類,所以要添加引用類的路徑,即修改MANIFEST.MF文件。保存如下內容到 D:\temp下,文件名 MANIFEST.MF
Manifest-Version: 1.0
Sealed: true
Main-Class: com.ldq.WeatherDemo
Class-Path: lib/jaxrpc.jar lib/log4j-1.2.8.jar lib/mail.jar lib/saaj.jar lib/tools.jar lib/wsdl4j-1.5.1.jar lib/activation.jar lib/axis.jar lib/axis-ant.jar lib/commons-discovery-0.2.jar lib/commons-logging-1.0.4.jar
注意在後面空兩行。
提示符進入 D:\temp 路徑下,輸入:jar umf MANIFEST.MF WeatherDemo.jar
執行時會提示更新的內容。
4、添加包含引用類的相應文件:
在 D:\temp 路徑下,新建 lib 文件夾,講對應的 jaxrpc.jar ... 拷入其中,此時,即可雙擊(或在提示符下輸入:java -jar WeatherDemo.jar)運行 WeatherDemo.jar 文件了。
三、總結
雙擊運行 jar 文件時,虛擬機會到 jar 文件中下找 .MF 文件,找到對應的 Main-Class 運行,引入的類在 Class-Path 所指路徑。
事實上可以利用 winrar或winzip 工具打開 jar 文件,直接將修改好的 MANIFEST.MF 拷入覆蓋,class文件也可以做同樣的操作,節省了輸入復雜難記的命令。另外,對於 javaME 生成的 jar 文件,限制嚴格些,MANIFEST.MF 文件中有個文件大小的欄位,可以先保存,查看文件大小,再修改保存。
另一種方法是通過 Eclipse - Export - Runnable JAR file 直接生成 jar 文件,此時,所有的引用類都被打包在 jar 文件里了。
㈨ ant編譯時遇到警告的編譯不通過,
<javac nowarn=on ...>
㈩ 如何使用Ant腳本編譯出Jar和Apk包
首先我們來看看如何使用ant腳本打出一個jar包 我們新建一個工程AntExportJar 在工程的目錄下面新建一個build.xml,這個是ant腳本規定的一個入口腳本文件,文件名都是:build.xml [html] view plain ?
<?xml version ="1.0" encoding ="UTF-8" ?>
<project name ="AntExportJar" basedir ="." default ="exportJar" >
????<!--?設置全局變數?-->
????<property name ="src" value ="src" />
????<property name ="dist" value ="dist" />
????<property name ="app.name" value ="ant" />
????<property name ="app.version" value ="1.0" />
????<property name ="classes.encode" value ="GBK" />
????<property name ="lib" value ="libs" />
????<property
????????name ="project-dir"
????????value ="C:\Users\i\workspace\AntExportJar" />
????<property
????????name ="sdk-folder"
????????value ="C:\Users\i\AppData\Local\Android\sdk" />
????<property
????????name ="platform-folder"
????????value ="${sdk-folder}\platforms\android-22" />
????<property
????????name ="android-jar"
????????value ="${platform-folder}\android.jar" />
????<property
????????name ="src"
????????value ="${project-dir}\src" />
????<property
????????name ="bin"
????????value ="${project-dir}\bin" />
????<property
????????name ="libs"
????????value ="${project-dir}\lib" />
????<!--?task?-->
????<target name ="init" >
????????<echo>
????????????Initialize...
????????</echo>
????????<delete dir ="${bin}" />
????????<mkdir dir ="${bin}" />
????</target>
????<target name ="buildFiles" depends ="init" >
????????<javac
????????????????bootclasspath ="${android-jar}"
????????????????compiler ="javac1.7"
????????????????target ="1.7"
????????????????destdir ="${bin}"
????????????????encoding ="GBK"
????????????????includeAntRuntime ="true"
????????????????listfiles ="true" >
????????????????<src path ="${project-dir}" />
????????????????<classpath>
?????????????????????<!--?引用第三方jar包需要引用,用於輔助編譯,並沒有將jar打包進去。jar的打包在dex命令中。-->
?????????????????????<fileset dir ="${libs}" includes ="*.jar" />
????????????????</classpath>
????????</javac>
????</target>
????<!--?導出jar文件?-->
????<target name ="exportJar" depends ="buildFiles" >
????????<delete dir ="${dist}" />
????????<!--?Create?the?distribution?directory?-->
????????<mkdir dir ="${dist}" />
????????<!--?Put?everything?in?${classes}?into?the?MyProject-${DSTAMP}.jar?file?-->
????????<jar jarfile ="${dist}/${app.name}.jar" basedir ="${bin}" >
????????????<!--
????????????<fileset?dir="${libs}"?includes="**/*.jar"?/>
????????????-->
????????????<zipfileset excludes ="META-INF/*.SF" src ="${libs}/Bai_NativeAd_SDK.jar" />
????????????<zipfileset excludes ="META-INF/*.SF" src ="${libs}/gdt_mob_release.jar" />
????????</jar>
????</target>
</project>
腳本很簡單,下面我們就來分析一下: [html] view plain ?
<project name ="AntExportJar" basedir ="." default ="exportJar" >
最外圍的一個標簽是project,是一個工程標簽,有名字,還有就是工程的目錄baseDir,用點號:"." 接下來就是定義全局變數,或者是屬性值: [html] view plain ?
<!--?設置全局變數?-->
<property name ="src" value ="src" />
<property name ="dist" value ="dist" />
<property name ="app.name" value ="ant" />
<property name ="app.version" value ="1.0" />
<property name ="classes.encode" value ="GBK" />
<property name ="lib" value ="libs" />
<property
????name ="project-dir"
????value ="C:\Users\i\workspace\AntExportJar" />
<property
????name ="sdk-folder"
????value ="C:\Users\i\AppData\Local\Android\sdk" />
<property
????name ="platform-folder"
????value ="${sdk-folder}\platforms\android-22" />
<property
????name ="android-jar"
????value ="${platform-folder}\android.jar" />
<property
????name ="src"
????value ="${project-dir}\src" />
<property
????name ="bin"
????value ="${project-dir}\bin" />
<property
????name ="libs"
????value ="${project-dir}\lib" />
這樣我們在後面就可以使用:${name值} 來使用value值的定義了,所以這里就相當於定義了變數的作用,這里我們看到有一些value值是路徑,但是這里我們感覺有一個不好的地方,就是這些路徑是寫死的,那麼我們還可以怎麼做能讓他變得靈活呢?其實很簡單,ant腳本中是可以訪問環境變數的,那麼我們只要將這些路徑定義成環境變數就可以了: [html] view plain ?
<property environment ="env" />
<property name ="ANDROID_HOME" value ="${env.ANDROID_HOME}" />
第一行先申明一個環境變數值,這個env是公共的寫法,也是ant自帶的,他表示當前的環境變數的值,那麼後面就可以訪問具體的哪些環境變數了,比如這里我配置了ANDROID_HOME這個環境變數,那麼就可以用${env.ANDROID_HOME}來訪問androidsdk的目錄了,和上面的那個直接使用絕對路徑的方式是一樣的。 解析來就是定義task了,在ant中task也是最重要的,我們最終運行的都是task,就相當於Java中的main方法一樣。ant腳本中可以定義多個task,而且每個task可以有執行的先後順序的。相當於Java中的方法中調用其他方法一樣。 [html] view plain ?
<!--?task?-->
<target name ="init" >
????<echo>
????????Initialize...
????</echo>
????<delete dir ="${bin}" />
????<mkdir dir ="${bin}" />
</target>
首先這里定義了一個初始化的task,其中echo標簽也是很常用的,就是列印信息的,然後是刪除目錄${bin},這個bin變數在上面已經定義了,然後在創建${bin}目錄。 初始化完之後,開始執行編譯工作: [html] view plain ?
<target name ="buildFiles" depends ="init" >
????<javac
????????bootclasspath ="${android-jar}"
????????compiler ="javac1.7"
????????target ="1.7"
????????destdir ="${bin}"
????????encoding ="GBK"
????????includeAntRuntime ="true"
????????listfiles ="true" >
????????<src path ="${project-dir}" />
????????????<classpath>
????????????????<!--?引用第三方jar包需要引用,用於輔助編譯,並沒有將jar打包進去。jar的打包在dex命令中。-->
????????????????<fileset dir ="${libs}" includes ="*.jar" />
????????????</classpath>
????</javac>
</target>
這里在此定義一個buildFiles的task,depends的值是表示當前的task在這個depends的task執行完之後在執行,這里就是先執行init的task,然後在執行buildFiles的task,這里的task主要是編譯Java成class文件: bootclasspath:表示編譯依賴的系統庫,這里依賴的是android.jar compiler:表示編譯的java版本 target:表示編譯之後的class的版本,就是能夠運行的java版本 destDir:表示編譯之後的class文件的存放目錄 其他的就不說了,這里還有一個重點,也就是我們在編譯的時候會遇到的問題,就是我們在編譯的時候,會引用到第三發的jar,所以這里我們為了保證能夠編譯過,這里還必須用classpath標簽來引用這些jar,當然這里只是能夠保證編譯通過,並不會把這些jar也編譯到最終我們想要的jar中,這個問題我們後面再說。 下面在看最後的一個task,就是將編譯完之後的class文件打包成jar文件: [html] view plain ?
<!--?導出jar文件?-->
<target name ="exportJar" depends ="buildFiles" >
????<delete dir ="${dist}" />
????<!--?Create?the?distribution?directory?-->
????<mkdir dir ="${dist}" />
????<!--?Put?everything?in?${classes}?into?the?MyProject-${DSTAMP}.jar?file?-->
????<jar jarfile ="${dist}/${app.name}.jar" basedir ="${bin}" >
????????<!--
????????<fileset?dir="${libs}"?includes="**/*.jar"?/>
????????-->
????<zipfileset excludes ="META-INF/*.SF" src ="${libs}/Bai_NativeAd_SDK.jar" />
????<zipfileset excludes ="META-INF/*.SF" src ="${libs}/gdt_mob_release.jar" />
????</jar>
</target>
這里我們定義了一個exportJar的task,他是在buildFiles的task運行完之後在運行。 首先刪除目標目錄${dist},然後在創建一個目錄。這個目錄就是存放最後編譯好的jar文件的目錄 然後就是用jar標簽來導出jar文件了: jarfile:表示編譯完之後存放的jar文件名路徑 basedir:表示需要編譯jar的class文件目錄 其他就OK了,但是在實際中我們在編譯的過程中會引用到第三方的jar,那麼這時候我們把這些jar編譯到最終的jar中,說道這里,其實我們在使用Eclipse導出jar的時候,有一個插件可以做到這點:fat-jar,安裝完插件