Antx的由來:html
<path id="classpath"> <fileset dir="${lib}" includes="*.jar"/> </path> <mkdir dir="${target.classes}"/> <javac srcdir="${src.java}" destdir="${target.classes}" debug="true" optimize="true" deprecation="true" encoding="GBK" source="1.4" target="1.4"> <classpath refid="classpath"/> </javac>
目標是管理:全部jar、war、ear等二進制包,及它們的依賴關係java
實戰以前,先安裝Antx:node
svn co http://svn.alibaba-inc.com/repos/opentech/antx/trunk/ antxreact
antx gen程序員
myprojectweb
│ project.jelly - 項目腳本文件shell
│ project.xml - 項目描述文件apache
│api
├─docs - 文檔目錄服務器
│
└─src - 源代碼目錄
└─java - Java源代碼目錄
定義一個簡單的Antx項目:修改project.xml:
<project id="my/project"> <build> <dependencies> <include uri="jakarta/commons/lang"/> </dependencies> </build> </project>
定義一個簡單的Antx項目:添加Java類:
package com.alibaba.myproject;
import org.apache.commons.lang.SystemUtils;
public class MyClass {
public String getGreeting() {
return "hello, " + SystemUtils.USER_NAME;
}
}
定義一個簡單的Antx項目:build項目:
java:compile:
[mkdir] Created dir: C:\myproject\target\classes
[javac] Compiling 1 source file to C:\myproject\target\classes
jar:jar:
[jar] Building jar: C:\myproject\target\my-project.jar
<project default="jar">
</project>
package com.alibaba.myproject; import junit.framework.TestCase; public class MyClassTest extends TestCase { private MyClass myClass; protected void setUp() { myClass = new MyClass(); } public void testGetGreeting() { assertEquals("hello, " + System.getProperty("user.name"), myClass.getGreeting()); } }
定義一個簡單的Antx項目:執行單元測試:
在myproject目錄下, 執行:antx test [mkdir] Created dir: C:\myproject\target\test.report [junit] Running com.alibaba.myproject.MyClassTest [junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.01 sec
定義一個簡單的Antx項目:用Eclipse來開發:
在myproject目錄下, antx eclipse eclipse:project: [echo] Creating C:\myproject/.project ... eclipse:classpath: [echo] Creating C:\myproject/.classpath ... eclipse: [echo] 若是您如今正在使用eclipse,請在project上點擊鼠標右鍵,選擇「Refresh」以便刷新項目 在Eclipse中import項目 選擇Existing projects into workspace
標準目標結構簡介:
myproject │ project.jelly - 項目腳本文件 │ project.xml - 項目描述文件 ├─docs - 文檔目錄 ├─src - 源目錄 │ ├─descriptors - JEE描述符 │ │ ├─ear - application.xml │ │ ├─ejb - ejb-jar.xml │ │ ├─rar - ra.xml │ │ └─web - web.xml │ ├─java - Java代碼目錄 │ ├─java.test - Java測試代碼目錄 │ ├─conf - 配置文件目錄 │ ├─conf.test - 用於測試的配置文件目錄 │ └─webroot - Webapp根目錄 │ ├─templates - webx模板目錄 │ └─WEB-INF - 標準WEB-INF目錄 └─target - 目標目錄 └─classes - Java類二進制文件目錄
中心Repository——項目的彈藥庫:
從新看project.xml <dependencies> <include uri="jakarta/commons/lang"/> </dependencies> 這個jakarta/commons/lang是什麼意思? 指向repository中的類庫的URI 全稱爲:jar:jakarta/commons/lang,相似還有:war:、ejb:、car:、ear:、rar: 請看antx\repository\jakarta\commons\lang目錄 其中的module.xml文件定義了jar包的位置、源代碼、javadoc的位置、依賴性等信息。
項目之間的依賴:建立項目2:
讓咱們建立另外一個項目:myproject2 <project id="my/project2"> <build> <dependencies> <include uri="my/project"/> </dependencies> </build> </project>
項目之間的依賴:建立類:
在src/java目錄下, 建立package: com\alibaba\myproject2 建立類文件:MyClass2.java package com.alibaba.myproject2; import com.alibaba.myproject.MyClass; public class MyClass2 { public static void main(String[] args) { System.out.println(new MyClass().getGreeting()); } }
項目之間的依賴:編譯並運行:
在myproject2目錄下 執行:antx 試運行命令: java –cp \myproject2\target\my-project2.jar; \myproject\target\my-project.jar; \antx\repository\jakarta\commons\lang\commons-lang-2.1.jar com.alibaba.myproject2.MyClass2 結果:hello, baobao
project2怎麼找到project1的jar:
答案就是:經過repository 請看$HOME\.antx\repository目錄 有一個my\project\module.xml文件,告訴project2: 去哪裏取得uri="my/project"的jar包 注意: 兩個project的源目錄之間沒有任何關係 兩個project只經過repository來通訊 不得循環依賴 project1必須在project2以前被build project2間接依賴project1所依賴的一切
多項目開發模式的優勢:
能夠在$HOME\antx.properties中改變默認值: antx.repository.project=YOUR_2ND_REPO_PATH 取得toolkit類庫 進入$HOME\.antx\repository.project目錄(或者你所指定的YOUR_2ND_REPO_PATH目錄) 執行: svn co http://svn.toolkit.alibaba-inc.com/trunk/binary-release/toolkit 在項目中使用toolkit 在project.xml中寫: <dependencies> <include uri="toolkit/webx/turbine"/> </dependencies>
改良多項目開發的模式:推薦的多項目目錄結構:
以Taobao網站爲例(紅色表明子項目,其中包含project.xml和project.jelly文件) taobao │ project.xml - 總控項目描述文件 │ ├─common - 共享utils子項目 │ └─util default goal:jar ├─dal - 數據訪問層子項目,default goal:jar ├─biz - 業務層子項目 │ ├─auction default goal:jar,deps:common/dal,common/util │ └─member default goal:jar,deps:common/dal,common/util ├─web - WEB表現層子項目 │ ├─auction default goal:car,deps:biz/auction │ └─member default goal:car,deps:biz/member ├─bundle - 將全部項目打成一個war或ear的子項目 │ └─war default goal:war,deps:car:web/auction,car:web/member └─deploy - 佈署環境子項目 default goal:deploy,deps:war:bundle/war
改良多項目開發的模式:簡化project.xml:
一組相關的子項目,一般會有相似的項目定義 爲了簡化,能夠這樣寫: <project id="taobao/dal" extends="../project.xml"> <build> <dependencies> … </dependencies> </build> </project>
改良多項目開發的模式:總控project.xml:
<project id="taobao/all" abstract="true"> <currentVersion>1.0</currentVersion> <build> <property name="java.compiler.source" value="1.5"/> <property name="java.compiler.target" value="1.5"/> </build> <projects name="taobao" version="1.0"> <project id="taobao/common/util" dir="common/util"/> <project id="taobao/dal" dir="dal"/> <project id="taobao/biz/auction" dir="biz/auction"/> <project id="taobao/biz/member" dir="biz/member"/> <project id="taobao/web/auction" dir="web/auction"/> <project id="taobao/web/member" dir="web/member"/> <project id="taobao/bundle/war" dir="bundle/war"/> <project id="taobao/deploy" dir="deploy"/> </projects> <projects name="toolkit-common" version="1.0"> <project id="toolkit/common/lang"/> ... </projects> <projects name="toolkit-webx" version="2.0"> <project id="toolkit/webx/framework"/> ... </projects> </project>
改良多項目開發的模式:build全部項目:
在總項目的根目錄下,執行: antx reactor 反應堆:reactor,也能夠理解爲foreach project 自動掃描目錄,找出全部非abstract的project.xml 分析其中的依賴關係,排出build順序 例如:項目A依賴項目B,則B排在A以前 依次執行每一個項目的build指令 Reactor命令的格式 antx reactor goals=指令1,指令2,… projects=項目ID1,項目ID2,… nodeps=true|false goals參數表明要對每一個項目執行的指令, 若是省略或值爲「default」表示執行project.jelly中定義的default goal。 projects參數表明要build的項目ID, 若是省略,表示build全部項目。 注意,項目所依賴的項目也會被build,除非指定了nodeps=true。 nodeps=true時,不build項目所依賴的其它項目。 你必須本身負責依賴關係。 若是省略,表示nodeps=false。
改良多項目開發的模式:Reactor圖解:
改良多項目開發的模式:在eclipse中開發多項目:
antx reactor
antx reactor goals=clean,default
antx reactor goals=eclipse,default
antx reactor projects=project1,project2 nodeps=true
antx–p RELEASE reactor
改良多項目開發的模式:多team合做圖:
改進Antx的性能:
Antx啓動很慢,是什麼緣由? 裝載repository 裝載project 解決方案 Lazy-loading repository 已解決 Antx Console antx –c 原理很簡單:執行完後不退出,第二次執行就很快了 使用Antx eclipse插件 http://svn.alibaba-inc.com/repos/opentech/antxclipse/trunk/update/index.html 原理同Antx Console
Antx Console的使用方法:
查看幫助:help help|? - 幫助 quit|exit - 退出 antx - 執行antx命令 list|ls/dir - 列出全部項目 cd <project id|..|/> - 跳轉至當前項目|上一級項目|根項目 load <project dir|*> - 裝入指定目錄下的項目|全部項目 profile <name> - 設置profile section <name> - 設置section
Antx plugin簡介:
antx clean 清除target目錄 清除docs\api目錄 清除docs\api.test目錄
Plugin: antx-xar:
antx jar|war|ear|rar|ejb|car|uberjar jar —— 將java類打包 war —— Java EE Web Application包 ear —— Java EE Enterprise Application包 rar —— Java EE Java Connector Adapter包 ejb —— Java EE EJB包 相似jar, 但對於特定服務器,可能會激發額外操做,例如weblogic:ejbc car —— Webx Component包, 結構相似war, 但缺乏WEB-INF/lib、WEB-INF/web.xml 多個car可組合成一個war uberjar —— 特殊的jar, 利用classloader技術,將全部的依賴打包在一個普通的jar裏,使之可單獨執行 目前有嚴重的性能問題,有待改進
Plugin: antx-java:
antx forrest 根據docs\xdocs中的XML文檔,在docs\site中生成HTML靜態文檔 antx forrest:clean 清除docs\site目錄 antx forrest:run 運行jetty server,動態顯示XML文檔 antx forrest:sync 將當前編輯的XML文檔同步到正在運行的jetty server中 antx forrest:demo 生成示範文檔
Plugin: antx-gen:
antx gen 生成標準的目錄結構 antx gen:basic-test 生成帶單元測試的標準目錄結構 antx gen:car|ejb|ear|war|rar 生成相應類型項目的標準目錄結構
Plugin: antx-javadoc:
antx javadoc 生成API文檔,在docs\api和docs\api.test目錄下
Plugin: antx-plugin:
antx plugin 建立plugin jar包 antx plugin:install 安裝plugin,使之可用
Plugin: antx-reactor:
antx reactor 前面已經介紹
Plugin: antx-eclipse:
antx eclipse 生成eclipse項目文件,包括: .project .classpath
Plugin: antx-config:
建立src/java/META-INF/autoconf/auto-config.xml <?xml version="1.0" encoding="gb2312"?> <config description="自動配置:my-project"> <group name="myproject"> <property name="myproject.workdir" description="工做目錄"/> <property name="myproject.domain" defaultValue="localhost" description="用來訪問myproject應用的一級域名"> <validator name="hostExist"/> </property> <property name="myproject.port" defaultValue="8080" description="用來訪問myproject應用的端口"> <validator name="number"/> </property> </group> <script> <generate template="myconf.xml.vm" destfile="myconf.xml" charset="GBK"/> </script> </config>
建立src/java/META-INF/autoconf/myconf.xml.vm <myconf> <workdir>$myproject_workdir</workdir> <url>http://www.$myproject_domain:$myproject_port/</url> </myconf> Build並配置 antx jar antx config uris=my/project
執行本身的腳本:
修改project.jelly <project default="jar"> <goal name="deploy" prereqs="jar,config"/> </project> 修改project.xml <build> <property name="uris" value="my/project"/> … </build> 執行:antx deploy
執行Ant tasks:
能夠在project.jelly中執行任意Ant tasks 修改project.jelly <project default="jar"> <goal name="deploy" prereqs="jar,config"/> <goal name="testant" prereqs="deploy"> <copy file="${jar_destfile.file}" todir="c:/"/> </goal> </project>