Antx簡介(ali_PPT)

Antx的由來:html

§最先,咱們用Makefile來build系統
•Makefile不適合Java的編譯
§後來,咱們用Ant來build系統
•開始時很不錯
•隨着項目增多,出現困難
§利用beanshell控制Ant API,將經常使用操做寫成plugin(插件),增長中心repository控制
•即Antx 1.0
•簡化了Ant的配置
•但beanshell-based plugin很難掌握
§利用maven 1.0中的jelly來控制Ant API
•即Antx 2.0
•簡化了建立plugin的過程
Antx和Ant:
§Ant是一套面向target的build系統
•Ant用戶必須瞭解怎樣作一件事,例如爲了編譯Java代碼:
<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>
§Antx是面向project的系統
•用戶不須要了解怎樣build系統
•用戶只須要定義project
§Project的目錄結構
§Project所依賴的包
§Build選項,例如:用JDK1.4仍是JDK5來編譯
•爲了編譯一個Java project,假設你的目錄結構是符合標準的,你只須要打命令: antx java:compile
Antx的組成:
§Plugin管理
•目的是解決:How to do something?
§例如:java plugin解決了如何編譯java代碼
§例如:war plugin解決了如何打war包
•基本技術:基於Jelly script
§在Jelly中可直接使用任何Ant task
§Project管理
•目的是描述:What does the project look like?
§例如:源代碼放在哪?
§例如:項目依賴哪些jar包?
•基本技術:純XML描述(project.xml)
§Repository管理

目標是管理:全部jar、war、ear等二進制包,及它們的依賴關係java

實戰以前,先安裝Antx:node

§前提條件
•JDK(推薦JDK5)
•設置JAVA_HOME環境變量
§從SVN中checkout antx source

svn co http://svn.alibaba-inc.com/repos/opentech/antx/trunk/ antxreact

•由於repository中包含不少第三方jar包,因此checkout須要一些時間
§Build antx source
•執行antx根目錄下的build.bat或build.sh
§將antx/bin目錄加入到PATH環境變量中
•方便使用antx
定義一個簡單的Antx項目:建立目錄:
§先建立一個c:\myproject目錄
§在此目錄下,建立標準的目錄結構:

antx gen程序員

§目錄結構以下:

myprojectweb

│  project.jelly  - 項目腳本文件shell

│  project.xml  - 項目描述文件apache

api

├─docs  - 文檔目錄服務器

└─src  - 源代碼目錄

    └─java  - Java源代碼目錄

定義一個簡單的Antx項目:修改project.xml:

§修改項目描述文件:project.xml
<project id="my/project">

    <build>

        <dependencies>

            <include uri="jakarta/commons/lang"/>

        </dependencies>

    </build>

</project>

定義一個簡單的Antx項目:添加Java類:

§在src/java目錄下,
•建立package: com\alibaba\myproject
•建立類文件:MyClass.java
package com.alibaba.myproject;

import org.apache.commons.lang.SystemUtils;

public class MyClass {

    public String getGreeting() {

        return "hello, " + SystemUtils.USER_NAME;
    }
}

定義一個簡單的Antx項目:build項目:

§在myproject目錄下,
•執行: antx jar

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

§設置默認的goal
•在project.jelly中設置:

<project default="jar">

</project>

•執行: antx,效果同 antx jar
定義一個簡單的Antx項目:建立單元測試:
§在src/java.test目錄下,
•建立package: com\alibaba\myproject
•建立類文件:MyClassTest.java
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所依賴的一切

多項目開發模式的優勢:

§鼓勵劃分模塊
§理順依賴關係
§二進制目標文件級的依賴——使開發者更專一於本身的項目
§項目數量具有線性擴展性——項目數量的增長並不會增長單個項目的複雜度
改良多項目開發的模式:
§在實際開發中存在問題
•每每在一個大項目中,包含多個相關子項目
§這些子項目一般一塊兒編譯、一塊兒發佈
§若是項目A依賴項目B,當B修改後,必須先生成B.jar才能使A看到B所做的修改,這樣很麻煩
§對於這些關係較緊密的子項目,最好可以進行源碼級的依賴。
•一個項目每每依賴另外一個team所開發的項目的成果
§這種狀況,應該使用二進制依賴
§存在版本更新的問題
•如何方便地build多個項目?
改良多項目開發的模式:三級repository:
§第一級(所謂的1st party類庫)
•位置:$HOME\.antx\repository
•用於關聯關係較緊密的子項目
§例如:同一個team在同一時間開發的若干子項目
•該repository的內容只存在於本地,不須要被共享
§第二級(所謂的2nd party類庫)
•位置(默認):$HOME\.antx\repository.project
•用於關聯關係較疏遠的子項目
§例如:不一樣team或不一樣時期開發的子項目
•該repository的內容須要被team間共享
•該repository的內容一般須要註明版本號
§第三級(所謂的3rd party類庫)
•位置:antx\repository
•用於定義第三方提供的類庫
§例如:Apache Jakarta類庫
•該repository隨着antx更新而更新
•該repository中的內容能夠被註明版本號,也能夠不注
2nd party repository:
能夠在$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 goals= eclipse,default命令生成全部子項目的eclipse項目文件
§將全部子項目導入到eclipse中,最好建立一個working set
§凡在總控項目中同屬一組的項目,都會被看做源碼依賴
•列在Project Properites中的Java Build Path > Projects中
•i.e.,項目A依賴A項目B,若是B的源代碼被修改,不須要從新build B,A可直接取得B的修改
§反之,則被看做二進制依賴
•列在Project Properites中的Java Build Path > Libraries中
改良多項目開發的模式:reactor命令舉例:
§Build全部項目

antx reactor

§清除並從新build全部項目

antx reactor goals=clean,default

§生成/更新全部項目的eclipse項目文件

antx reactor goals=eclipse,default

§手工build指定項目(忽略依賴關係)

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 –c reactor
•執行完正常的reactor後,進入console模式
•執行list命令可列出全部項目
•用cd命令可進入指定項目
§ antx –c
•直接進入console模式,不執行任何命令
•此時內存中沒有項目,欲裝入全部項目,可執行antx reactor或antx reactor:list命令
§直接裝入某個項目的方法
•進入console模式之後,執行:
§load project_dir

Antx plugin簡介:

§請看:$HOME\.antx\plugin目錄
•每個目錄表明一個plugin
•每一個plugin定義了一組相關的操做方法
§定義在plugin.jelly文件中
§例如:antx-java定義了編譯java的方法
§例如:antx-jar定義了打jar包的方法
•每一個plugin定義了一組默認值
§定義在project.xml文件中的<projectDefault>標籤中
§例如:antx-java定義了java.compiler.source的默認值是1.4,也就是說,若是項目的project.xml中不加指定,將以JDK1.4兼容的方式來編譯源碼。
§查看該目錄下plugin的源文件,是瞭解一個plugin功能、默認值的最佳方法。
Plugin: antx-clean :
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 java
•編譯Java源代碼
Plugin: antx-test:
§ antx test
•運行全部單元測試類
•結果記錄在target/test.report目錄中
Plugin: antx-forrest:
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:

§ antx config uris =…
•自動生成Xar包中的配置文件
§解決什麼問題:
•前面已經講過,利用二進制發佈應用的好處
•然而帶來一個問題:若是二進制發佈包中包含一些個性化參數怎麼辦?
§例如:IP、域名、目錄名、端口、用戶名等
§這些參數對每一個人、每一個運行環境都有可能不一樣
§將這些參數固定在配置文件中顯然不合適,應該自動生成
§問題是自動生成必須發生在打包前,這和二進制發佈的流程相矛盾
•Antx-config功能解決了這個問題:
§先發布,後配置
§程序員提供配置的模板、變量名、變量的限定條件
§配置員(要使用二進制發佈的人)提供變量的值,並接受限定條件的檢查
§系統結合模板和變量值,生成個性化配置文件。
§整個過程能夠遞歸到每一層包中(ear中包含war,war中又包含jar)
建立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>
相關文章
相關標籤/搜索