<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    WEB開發 de 點滴

    by sanwish

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      38 隨筆 :: 0 文章 :: 4 評論 :: 0 Trackbacks

    2008年11月7日 #

    有一個問題先提出來,安裝oracle必須直接在系統上安裝,不能通過遠程桌面或者終端服務安裝,否則會報“ORA-12560: TNS: 協議適配器錯誤”。還有一點,oracle8.1.7有一個補丁程序PATCH_SET_FOR_ORACEL_DATA_8174_WINNT.zip,以前從來沒有見過,這次是從教育網里花了一天時間下載下來的,不知道是不是在win2003上安裝必須的(下周即可見分校曉)。

    1、如果你的oracle8.1.7是原始版的,檢查
    /stage/Components/oracle.swd.jre/
    1.1.7.30/1/DataFiles/Expanded/jre/win32/bin下的symcjit.dll文件,改名或者直接刪除。
    /stage/Components/oracle.omb.jdk/1.1.8/1/DataFiles/Expanded/jdk118_nt/bin路徑下的symcjit.dll文件做同樣處理。

    2、如果遇到點擊setup.exe無反應,在install目錄下打開文件’oraparam.ini’把參數 JRE_MEMORY_OPTIONS改為

    RE_MEMORY_OPTIONS = -nojit -ms16m -mx32m 即可。

    3、執行本地硬盤install\win32\setup.exe目錄下的Setup.exe文件。此時調用的是修改過的參數文件oraparam.ini。?
    ?
    4、安裝時選擇自定義模式,并且不創建數據庫。
    ?? 具體參照<windows+oracle8 install manual>

    posted @ 2009-02-10 15:00 sanwish 閱讀(1521) | 評論 (0)編輯 收藏

    sql1:select?? column_name?? from?? all_tab_columns?? where?? table_name='table1';
    sql2:select?? column_name?? from?? user_tab_columns?? where?? table_name='table1';


    我在運行sql1的時候碰到,如果數據庫中有相同用戶的話,會檢索出重復的字段名。
    后來把用戶的dba權限去掉了就好了。
    revoke dba from user1;

    運行sql2,雖然不出現重復的,但是客戶說最終工程所用的DB用戶和表的所有者不是一個,所以不能用user_table_columns。
    oracle知識太缺乏,不明白客戶說的意思

    關于sql1重復的問題,還是不清楚,具體的參照權限應該怎么取消?取消dba太大了吧。
    posted @ 2008-12-03 09:48 sanwish 閱讀(2930) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-10 10:02 sanwish 閱讀(225) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-10 10:00 sanwish 閱讀(1469) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-10 09:56 sanwish 閱讀(260) | 評論 (0)編輯 收藏

    對于 Oracle 的 rownum 問題,很多資料都說不支持>,>=,=,between...and,只能用以上符號(<、<=、!=),并非說用>,>=,=,between..and 時會提示SQL語法錯誤,而是經常是查不出一條記錄來,還會出現似乎是莫名其妙的結果來,其實您只要理解好了這個 rownum 偽列的意義就不應該感到驚奇,同樣是偽列,rownum 與 rowid 可有些不一樣,下面以例子說明

    假設某個表 t1(c1) 有 20 條記錄

    如果用 select rownum,c1 from t1 where rownum < 10, 只要是用小于號,查出來的結果很容易地與一般理解在概念上能達成一致,應該不會有任何疑問的。

    可如果用 select rownum,c1 from t1 where rownum > 10 (如果寫下這樣的查詢語句,這時候在您的頭腦中應該是想得到表中后面10條記錄),你就會發現,顯示出來的結果要讓您失望了,也許您還會懷疑是不誰刪了一些記錄,然后查看記錄數,仍然是 20 條啊?那問題是出在哪呢?

    先好好理解 rownum 的意義吧。因為ROWNUM是對結果集加的一個偽列,即先查到結果集之后再加上去的一個列 (強調:先要有結果集)。簡單的說 rownum 是對符合條件結果的序列號。它總是從1開始排起的。所以你選出的結果不可能沒有1,而有其他大于1的值。所以您沒辦法期望得到下面的結果集:

    11 aaaaaaaa
    12 bbbbbbb
    13 ccccccc
    .................

    rownum >10 沒有記錄,因為第一條不滿足去掉的話,第二條的ROWNUM又成了1,所以永遠沒有滿足條件的記錄。或者可以這樣理解:

    ROWNUM 是一個序列,是oracle數據庫從數據文件或緩沖區中讀取數據的順序。它取得第一條記錄則rownum值為1,第二條為2,依次類推。如果你用>,>=,=,between...and這些條件,因為從緩沖區或數據文件中得到的第一條記錄的rownum為1,則被刪除,接著取下條,可是它的rownum還是1,又被刪除,依次類推,便沒有了數據。

    有了以上從不同方面建立起來的對 rownum 的概念,那我們可以來認識使用 rownum 的幾種現像

    1. select rownum,c1 from t1 where rownum != 10 為何是返回前9條數據呢?它與 select rownum,c1 from tablename where rownum < 10 返回的結果集是一樣的呢?
    因為是在查詢到結果集后,顯示完第 9 條記錄后,之后的記錄也都是 != 10,或者 >=10,所以只顯示前面9條記錄。也可以這樣理解,rownum 為9后的記錄的 rownum為10,因條件為 !=10,所以去掉,其后記錄補上,rownum又是10,也去掉,如果下去也就只會顯示前面9條記錄了

    2. 為什么 rownum >1 時查不到一條記錄,而 rownum >0 或 rownum >=1 卻總顯示所以的記錄
    因為 rownum 是在查詢到的結果集后加上去的,它總是從1開始

    3. 為什么 between 1 and 10 或者 between 0 and 10 能查到結果,而用 between 2 and 10 卻得不到結果
    原因同上一樣,因為 rownum 總是從 1 開始

    從上可以看出,任何時候想把 rownum = 1 這條記錄拋棄是不對的,它在結果集中是不可或缺的,少了rownum=1 就像空中樓閣一般不能存在,所以你的 rownum 條件要包含到 1

    但如果就是想要用 rownum > 10 這種條件的話話就要用嵌套語句,把 rownum 先生成,然后對他進行查詢。
    select *
    from (selet rownum as rn,t1.* from a where ...)
    where rn >10

    一般代碼中對結果集進行分頁就是這么干的。

    另外:rowid 與 rownum 雖都被稱為偽列,但它們的存在方式是不一樣的,rowid 可以說是物理存在的,表示記錄在表空間中的唯一位置ID,在DB中唯一。只要記錄沒被搬動過,rowid是不變的。rowid 相對于表來說又像表中的一般列,所以以 rowid 為條件就不會有 rownum那些情況發生。
    另外還要注意:rownum不能以任何基表的名稱作為前綴。
    posted @ 2008-11-10 09:55 sanwish 閱讀(174) | 評論 (0)編輯 收藏

    半角數字
    unicode0123456789abcdef
    0x300123456789:;<=>?


    全角數字
    unicode0123456789abcdef
    0xff10


    半角英字
    unicode0123456789abcdef
    0x40@ABCDEFGHIJKLMNO
    0x50PQRSTUVWXYZ[\]^_
    0x60`abcdefghijklmno
    0x70pqrstuvwxyz{|}~


    全角英字
    unicode0123456789abcdef
    0xff20
    0xff30_
    0xff40
    0xff50?


    ひらがな
    unicode0123456789abcdef
    0x3050?
    0x3050
    0x3060
    0x3070
    0x3080
    0x3090???????


    全角カタカナ
    unicode0123456789abcdef
    0x3050?
    0x30b0
    0x30c0
    0x30d0
    0x30e0
    0x30f0??????


    半角カタカナ
    unicode0123456789abcdef
    0xff60??
    0xff70
    0xff80
    0xff90


    半角記號
    unicode0123456789abcdef
    0x20?!"#$%&'()*+,-./
    0x300123456789:;<=>?
    0x40@ABCDEFGHIJKLMNO
    0x50PQRSTUVWXYZ[\]^_
    0x60`abcdefghijklmno
    0x70pqrstuvwxyz{|}~
    0xff60??


    全角記號
    unicode0123456789abcdef
    0x2010??????????
    0x3000 ?
    0x30f0??????
    0xff00? ??
    0xff10
    0xff20
    0xff30_
    0xff40
    0xff50?
    0xffe0???????????

    posted @ 2008-11-07 13:29 sanwish 閱讀(1017) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 13:27 sanwish 閱讀(364) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 13:20 sanwish 閱讀(557) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:37 sanwish 閱讀(2009) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:35 sanwish 閱讀(422) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:31 sanwish 閱讀(677) | 評論 (1)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:24 sanwish 閱讀(290) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:21 sanwish 閱讀(266) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:14 sanwish 閱讀(189) | 評論 (0)編輯 收藏

    構造方法的繼承
    子類可以繼承父類的構造方法,原則如下:
    ??? 1. 子類無條件繼承父類的默認構造函數。
    ??? 2. 若子類有構造函數,則創建對象時先調用繼承自父類的默認構 造函數,再執行自己的構造函數。
    ??? 3. 對于父類有參數的構造函數,子類可以通過在自己的構造函數 中使用 super 關鍵字來調用它,但這個語句必須是子類構造函數 的第一個可執行語句。
    posted @ 2008-11-07 11:10 sanwish 閱讀(149) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:07 sanwish 閱讀(131) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:05 sanwish 閱讀(151) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 11:00 sanwish 閱讀(186) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 10:59 sanwish 閱讀(317) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 10:56 sanwish 閱讀(680) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 10:54 sanwish 閱讀(158) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 10:52 sanwish 閱讀(1250) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 10:48 sanwish 閱讀(657) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2008-11-07 10:47 sanwish 閱讀(288) | 評論 (0)編輯 收藏

    ■ 常用特殊字符

      只要你認識了 HTML 標記,你便會知道特殊字符的用處。

    HTML 原代碼 顯示結果 描述
    &lt; < 小于號或顯示標記
    &gt; > 大于號或顯示標記
    &amp; & 可用于顯示其它特殊字符
    &quot; " 引號
    &reg; ? 已注冊
    &copy; ? 版權
    &trade; ? 商標
    &ensp; 半個空白位
    &emsp; 一個空白位
    &nbsp; 不斷行的空白
    ■ ISO Latin-1 特殊字符
    HTML 原代碼 顯示結果 描述
    &AElig; ? Uppercase AE diphthing
    &Aacute; á Uppercase A, acute accent
    &Acirc; ? Uppercase A, circumflex accent
    &Agrave; à Uppercase A, grave accent
    &Aring; ? Uppercase A, ring
    &Atilde; ? Uppercase A, tilde
    &Auml; ? Uppercase A, dieresis or umlaut mark
    &Ccedil; ? Uppercase C, cedilla
    &ETH; D Uppercase Eth, Icelandic
    &Eacute; é Uppercase E, acute accent
    &Ecirc; ê Uppercase E, circumflex accent
    &Egrave; è Uppercase E, grave accent
    &Euml; ? Uppercase E, dieresis or umlaut mark
    &Iacute; í Uppercase I, acute accent
    &Icirc; ? Uppercase I, circumflex accent
    &Igrave; ì Uppercase I, grave accent
    &Iuml; ? Uppercase I, dieresis or umlaut mark
    &Ntilde; ? Uppercase N, tilde
    &Oacute; ó Uppercase O, acute accent
    &Ocirc; ? Uppercase O, circumflex accent
    &Ograve; ò Uppercase O, grave accent
    &Oslash; ? Uppercase O, slash
    &Otilde; ? Uppercase O, tilde
    &Ouml; ? Uppercase O, dieresis or umlaut mark
    &THORN; T Uppercase THORN, Icelandic
    &Uacute; ú Uppercase U, acute accent
    &Ucirc; ? Uppercase U, circumflex accent
    &Ugrave; ù Uppercase u, grave accent
    &Uuml; ü Uppercase U, dieresis or umlaut mark
    &Yacute; Y Uppercase Y, acute accent
    &aelig; ? Lowercase ae diphthing
    &aacute; á Lowercase a, acute accent
    &acirc; a Lowercase a, circumflex accent
    &agrave; à Lowercase a, grave accent
    &aring; ? Lowercase a, ring
    &atilde; ? Lowercase a, tilde
    &auml; ? Lowercase a, dieresis or umlaut mark
    &ccedil; ? Lowercase c, cedilla
    &eth; e Lowercase eth, Icelandic
    &eacute; é Lowercase e, acute accent
    &ecirc; ê Lowercase e, circumflex accent
    &egrave; è Lowercase e, grave accent
    &euml; ? Lowercase e, dieresis or umlaut mark
    &iacute; í Lowercase i, acute accent
    &icirc; ? Lowercase i, circumflex accent
    &igrave; ì Lowercase i, grave accent
    &iuml; ? Lowercase i, dieresis or umlaut mark
    &ntilde; ? Lowercase n, tilde
    &oacute; ó Lowercase o, acute accent
    &ocirc; ? Lowercase o, circumflex accent
    &ograve; ò Lowercase o, grave accent
    &oslash; ? Lowercase o, slash
    &otilde; ? Lowercase o, tilde
    &ouml; ? Lowercase o, dieresis or umlaut mark
    &szlig; ? Lowercase sharp s, German (sz ligature)
    &thorn; t Lowercase thorn, Icelandic
    &uacute; ú Lowercase u, acute accent
    &ucirc; ? Lowercase u, circumflex accent
    &ugrave; ù Lowercase u, grave accent
    &uuml; ü Lowercase u, dieresis or umlaut mark
    &yacute; y Lowercase y, acute accent
    &yuml; ? Lowercase y, dieresis or umlaut mark
    posted @ 2008-11-07 10:33 sanwish 閱讀(350) | 評論 (0)編輯 收藏

    CMMI(Capability Maturity Model Integration,能力成熟度模式整合)

    CMMI( Capability Maturity Model Integration)的本質是軟件管理工程的一個部分。軟件過程改善是當前軟件管理工程的核心問題, 50多年來計算的發展使人們認識到要高效率、高質量和低成本地開發軟件,必須改善軟件生產過程。基於模型的過程改進是指用採用能力模型來指導組織的過程改進,使之過程能力穩定的進行改善,該組織也能變得更加成熟。

    然而,軟件組織形成一套完整而成熟的軟件過程不是一蹴而就的事情,需要經歷一系列的成熟度。軟件組織首先要進行差異分析,評定自己比較接近哪一個成熟度,然後再根據自身的情況來決定要採取哪些改進活動,來更有效地改進自己的軟件過程。這就對軟件過程的評定提出了一個客觀的標準。美國卡內基梅隆大學軟件工程學院於1987年研究成功的SW-CMM(Capability Maturity Model for Software)就是這樣的一個理論模型,其目的在於幫助軟件組織改善軟件生產流程,以探索一個保證軟件產品質量、縮短開發週期、提高工作效率的軟件工程模式與標準規範。

    CMMI是一個可以改進系統工程和軟件工程的整合模式。1997年10月SEI停止對CMM的研究,改而致力於CMMI,以解決使用多個過程改進模型的問題。SEI同時宣佈CMMI將取代CMM,與2000年8月11日頒布了CMMI-SE/SW 1.0版本,2001年12月頒布了1.1版本,這次發佈標誌著CMMI正式啟用,並準備今年內完成CMM到CMMI的過渡。

    posted @ 2008-11-07 10:26 sanwish 閱讀(145) | 評論 (0)編輯 收藏

    CMM是由美國軟件工程學會(Software engineering inStitute)制定的一套專門針對軟件產品的質量管理和質量保證標準。該標準最初是為美國軍方選擇軟件產品提供商時評價軟件企業的軟件開發質量保證能力而制定,所以稱為軟件企業能力成熟度模型(Capability Maturity Model,簡稱CMM)。該標準將軟件企業的能力成熟度劃分為5個等級,級別越高表明該企業在提供合格軟件產品方面的能力越強。

    CMMCapability Maturity Model  是能力,成熟度模型的縮寫。CMM的工作最早開始于 1986年11月,當時為了滿足美國聯邦政府評估軟件供應商能力的要求,美國卡內基·梅隆大學的軟件工程研究院Sei 牽頭,在Mitre公司的協助下,于1987年9月發布了一份能力成熟度框架Capability Maturity fraMework 以及一套成熟度問卷 Maturity QueStionnaire .很多人認為這套問卷就代表了CMM模型,其實它只是用于探索軟件過程成熟度的一個工具,真正的模型出現在四年以后。Sei總結了自1987年以來對成熟度框架和初版成熟度問卷的實戰經驗,并以此為基礎,推出了CMM1.0 版。這個推出于 1991年的 CMM1.0 集中了四年來對軟件公司評估的經驗以及廣泛的用戶反饋,在成熟度框架的基礎上建立了一個可用的模型,這個模型可以更加有效地幫助軟件企業建立和實施過程改進計劃。

    CMM1.0 版使用兩年之后,于1992年四月進行了一個研討會,參加研討會的有約兩百名富有經驗的軟件專業人員。在廣泛聽取了他們的反饋意見之后,Sei于 1993 年推出了CMM1.1 版。近幾年來,CMM又推出了2.0 版本,同時進入了iSo 體系,稱為 iSo/ieC15504 或 SpiCe. SpiCe從1995年起進入實地測試階段,可能于2001年發布 。

    CMM 致力于軟件開發過程的管理及工程能力的提高與評估。該模型在美國和北美地區已得到廣泛應用同時正在被越來越多的歐洲和亞洲等國家的大型信息技術企業所采納,實際上已成為軟件開發過程改進與評估的事實上的工業標準。

    印度是軟件大國,十分重視軟件開發過程的管理及與其相關的理論與標準的發展。據統計,在印度的2000多家軟件公司中有75家軟件公司通過了iSo9000認證,60多家軟件公司通過了CMM認證,其中達到CMM5級一家,4級三家,3級4家。

    CMM與iSo9000的區別主要有以下幾點:CMM是專門針對軟件產品開發及服務的,而iSo9000則有寬得多的范圍;CMM強調軟件開發過程的成熟度,即過程的不斷改進和提高,而iSo9000則僅描述可接收的質量體系的最低標準;CMM3級的覆蓋范圍要大于iSo9000的覆蓋范圍。

    引進CMM的意義有兩個方面

    1.對軟件企業:

    提高軟件開發的管理能力:CMM提供了軟件企業自我評估的方法和自我提高的手段;提高軟件生產率;加強軟件生產的國際競爭力。

    2.對軟件項目發包單位和軟件用戶:

    提供了對軟件開發商開發管理水平的評估手段,有助于軟件開發項目的風險識別。

    posted @ 2008-11-07 10:26 sanwish 閱讀(169) | 評論 (0)編輯 收藏

    CMM與CMMI對比
    來源:Worthy Tech
    CMMI:

    CMMI 全稱是Capability Maturity Model Integration, 即軟件能力成熟度模型集成模型,是由美國國防部與卡內基-梅隆大學和美國國防工業協會共同開發和研制的。CMMI是一套融合多學科的、可擴充的產品集合,其研制的初步動機是為了利用兩個或多個單一學科的模型實現一個組織的集成化過程改進。CMMI可以解決現有不同CMM模型的重復性、復雜性,并減少由此引起的成本、縮短改進過程,它將軟件CMM2.0版草案(SW-CWW)、EIA過渡標準731(系統工程CMM)及IPD-CMM集成為一體,同時還與 ISO15504相兼容。 CMMI是有效過程元素的集合,目前有如下模型:?
    CMMI是有效過程元素的集合,目前有如下模型:
    CMMI-SE/SW/IPPD/SS,V1.1
    CMMI-SE/SW/IPPD V1.1
    CMMI-SE/SW V1.1
    CMMI-SW V1.1?


    CMMI自推出以來,在世界各地得到了廣泛的推廣與接受。在日本、歐洲、臺灣、印度等地都有很多企業在推廣與應用CMMI模型。尤其在印度CMMI的應用甚至超過了美國。

    CMMI階段式的基本結構從CMM演變而來,但是CMMI的結構更加的形式化和精致,也更加的復雜,尤其為了保證連續式和階段式的同一性,更加增加了結構的理解難度。

    CMMI強調了對需求的管理,有兩個過程域說明對需求的控制:需求管理REQM、需求開發RD。而在CMM中只有一個關鍵過程域需求管理RM以及軟件產品工程SPE中的一個實踐來說明對需求的管理和控制。

    CMMI加強了對工程過程的重視,提供了更加細致的要求和指導,而CMM中卻只有一個SPE關鍵過程來進行要求和指導CMMI強調了度量,并且從項目的早期就已經進行了度量,在階段式中CMMI二級由一個過程域度量和分析;而在CMM中沒有專門的要求和指導。

    CMMI對比CMM更加強調了對風險的管理,在CMM中風險只“是項目策劃”SPP中的一個活動,而在CMMI中風險管理作為一個單獨的過程域。 

    CMM:
    CMM作為較早推出的軟件過程改進標準,目前已在世界范圍被廣泛地推廣和應用。不可否認,CMM在建立有效的開發系統、控制軟件產品開發過程式、降低軟件企業內外部故障成本、提高企業的經濟效益和社會效益等方面,取得了巨大成功。

    但CMM也存在著一些不足,如CMM中的一個關鍵過程域“組間協調”IC在CMMI中地位下降,只是作為“集成化項目管理”IPM中的一個目標。


    CMM中的關鍵過程域“同行評審”PR,在CMMI中得到了更高的抽象;對應CMMI的“驗證”VER,說明了對產品進行相應的QC活動。(同行評審本身就是一種QC活動)。

    CMMI的公共特性中,沒有了測量(ME),這些度量內容被組織起來形成了一個支持過程“度量和分析”。具體理由如下:
    度量和分析本身應用的復雜性和它執行的高成本在原來的CMM中每個KPA均有單獨的測量要求,容易造成“過度測量”,也沒有形成對組織級的、統一的度量體系的指導和要求,造成實施中的困難。例如在CMM中如果一個組織達到了CMM三級,由于各個KPA均要求了測量(ME),實際上已經建立了全組織過程的測量,這和CMM的等級劃分思想是有著沖突的。

    總結:
    CMMI改進了這個方面,要求組織從組織級的統一要求出發建立度量體系。這樣的想法也符合過程改進理論的思想;這樣組織在實施過程中可以選擇必要的過程進行測量,而不是全部過程的測量,從這個意義上,CMMI對比CMM降低了對度量的要求和實施難度,但是更加具有全局性和可實施性。

    CMM是作為評估標準出現的,所以是“必要”的才能保證評估的標準。

    CMMI是作為改進模型出現的,羅列了較多的最佳實踐,利于過程的改進。

    posted @ 2008-11-07 10:25 sanwish 閱讀(149) | 評論 (0)編輯 收藏

    背景:
    EasyMock 2 版本必須要 JDK5 才能使用 EasyMock 1.2 可以在 JDK 1.4 使用
    也可以使用 Retrotranslator 將 EasyMock 2 版本改為 JDK 1.4 也可以使用的。
    目前使用的是 EasyMock 2.2

    準備:
    先弄個接口 Haha 用來 Mock 的,兩個方法
    void haha(String s);
    String hehe(String s);

    開始 Mock:

    靜態導入 EasyMock
    import static org.easymock.EasyMock.*;

    然后
    Haha haha=createMock(Haha.class);

    無返回值的調用可以直接調用 Mock 方法

    haha.haha("haha");

    有返回值的可以

    expect(haha.hehe("hehe")).andReturn("ok");

    這樣做完后

    你要 replay(haha); 一下,表示錄完 mock ,準備重放了。

    就可以調用 haha.haha("haha") 了,同樣的,調用 haha.hehe("hehe") 的返回值是 "ok"

    全部調用完了,使用 verify(haha); 查看一下預期的調用是不是都調了,如果預期要調用一次,卻沒調,那就會 AssertionError 哦。

    調用次數

    上面這些都是默認調用一次,就相當于 expect(haha.hehe("hehe")).andReturn("ok").times(1); 或 expect(haha.hehe("hehe")).andReturn("ok").once();

    如果想調用任意次,就 expect(haha.hehe("hehe")).andReturn("ok").anyTimes();

    如果想最少調用一次,就 expect(haha.hehe("hehe")).andReturn("ok").atLeastOnce();

    如果想調用 1 至 3 次,就 expect(haha.hehe("hehe")).andReturn("ok").times(1,3);

    預期的結果

    還可以 expect(haha.hehe("hehe")).andReturn("ok").andReturn("ok too").andThrow(new RuntimeException());

    這樣,第一次調用 haha.hehe("hehe") 時返回 "ok" ,第二次返回 "ok too",第三次調用就比較慘了,會拋出一個 RuntimeException,需要注意
    的是,如果拋出的異常是 unchecked 的,就是 Runtime 的,就隨便拋,如果是 checked 的,那就一定要拋這個方法定義的,否則會在 andThrow 這行出 IllegalArgumentException 。

    終極解決辦法還可以使用 andAnswer(IAnswer<T> answer) 傳一個實現 IAnswer 接口的實例,這個接口只有一個方法
    T answer() throws Throwable;
    隨便你返回什么,或是拋出什么異常。

    調用順序

    不 過如上面所說,haha.haha("haha") 與 haha.hehe("hehe") 是沒有順序的,將 createMock 改成 createStrictMock 或在 createMock 后面加一行 checkOrder(haha,true) 就可以了,這時,就一定要按照定義的順序來調用了。

    如果多個不同的 mock 也要保證順序呢?那就不能使用 createMock 來創建這些 mock 了,因為每次 createMock 都會使用一個新的 IMocksControl 實例來單獨控制這個 mock ,我們希望將多個 mock 用同一個 IMocksControl 控制,只需要

    IMocksControl ctrl = createStrictControl();
    Haha haha1= ctrl.createMock(Haha .class);
    Haha haha2 = ctrl.createMock(Haha .class);

    haha1.haha("haha1");
    haha2.haha("haha2");

    ctrl.replay();

    就可以了

    預期的參數

    剛才 haha.haha("haha") 中的 "haha" 就是預期的參數,EasyMock 提供了很多預期參數的方法,比如 haha.haha(eq("haha")),與前面的方法功能完全一樣
    haha.haha((String)anyObject) 隨便你傳什么參數都沒問題。
    haha.haha(not(eq("haha"))) 這個只要不傳 haha ,其它什么都成

    同 樣可以自定義,只要調用 ??? public static void reportMatcher(IArgumentMatcher matcher) 方法,將自定義的 IArgumentMatcher 傳進去就可以了,這個接口有兩個方法 boolean matches(Object argument)?? 和 void appendTo(StringBuffer buffer) 第一個方法的參數是調用實際傳入的值,返回是否匹配,第二個方法是錯誤時向 buffer 中 append 錯誤信息。

    將方法弄成 Stub

    Stub 方法,我想應該就是隨便調,愛怎么調就怎么調,返回的都是那個值,最后也不會驗證到底調用了多少次。
    如果想把一個方法弄成 Stub,無返回值的只要 asStub() 就是 expect(haha.haha("haha")).asStub() ,有返回值的就 andStubReturn() , andStubAnswer() 這樣就可以了。

    友好的Mock

    我們使用 createMock 創建出來的 mock 對象,如果沒有錄過,調用這個方法都會出 AssertionError ,但如果使用 createNiceMock 就不會了,會返回 0 , null , false 這樣的。
    posted @ 2008-11-07 09:56 sanwish 閱讀(451) | 評論 (0)編輯 收藏

    1 Ant是什么?
    Apache Ant 是一個基于 Java的生成工具。
    簡單點說就是:java中的MAKEFILE,它根據build.xml的內容自動編譯java
    2 下載、安裝Ant
    安裝Ant
    下載.zip文件,解壓縮到c:\ant1.3(后面引用為%ANT_HOME%)

    2.1 在你運行Ant之前需要做一些配置工作。
    ? 將bin目錄加入PATH環境變量。
    ? 設定ANT_HOME環境變量,指向你安裝Ant的目錄。在一些OS上,Ant的腳本可以猜測ANT_HOME(Unix和Windos NT/2000)-但最好不要依賴這一特性。
    ? 可選地,設定JAVA_HOME環境變量(參考下面的高級小節),該變量應該指向你安裝JDK的目錄。
    注意:不要將Ant的ant.jar文件放到JDK/JRE的lib/ext目錄下。Ant是個應用程序,而lib/ext目錄是為JDK擴展使用的(如JCE,JSSE擴展)。而且通過擴展裝入的類會有安全方面的限制。
    2.2 運行Ant

    運行Ant非常簡單,當你正確地安裝Ant后,只要輸入ant就可以了。

    一般以:ant 打頭 加一個build.xml中target 中的name屬性的值...下一篇我講介紹build.xml各個任務的作用

    ? 沒有指定任何參數時,Ant會在當前目錄下查詢build.xml文件。如果找到了就用該文件作為buildfile。如果你用 -find 選項。Ant就會在上級目錄中尋找buildfile,直至到達文件系統的根。要想讓Ant使用其他的buildfile,可以用參數 -buildfile file,這里file指定了你想使用的buildfile。

    ? 可以指定執行一個或多個target。當省略target時,Ant使用標簽<project>的default屬性所指定的target。


    命令行選項總結:
    ant [options] [target [target2 [target3] ...]]
    Options:
    -help print this message
    -projecthelp print project help information
    -version print the version information and exit
    -quiet be extra quiet
    -verbose be extra verbose
    -debug print debugging information
    -emacs produce logging information without adornments
    -logfile file use given file for log output
    -logger classname the class that is to perform logging
    -listener classname add an instance of class as a project listener
    -buildfile file use specified buildfile
    -find file search for buildfile towards the root of the filesystem and use the first one found
    -Dproperty=value set property to value
    例子
    ant
    使用當前目錄下的build.xml運行Ant,執行缺省的target。
    ant -buildfile test.xml
    使用當前目錄下的test.xml運行Ant,執行缺省的target。
    ant -buildfile test.xml dist
    使用當前目錄下的test.xml運行Ant,執行一個叫做dist的target。
    ant -buildfile test.xml -Dbuild=build/classes dist
    使用當前目錄下的test.xml運行Ant,執行一個叫做dist的target,并設定build屬性的值為build/classes。

    3 編寫build.xml

    Ant的buildfile是用XML寫的。每個buildfile含有一個project。

    buildfile中每個task元素可以有一個id屬性,可以用這個id值引用指定的任務。這個值必須是唯一的。(詳情請參考下面的Task小節)

    3.1 Projects

    project有下面的屬性:
    Attribute Description Required
    name 項目名稱. No
    default 當沒有指定target時使用的缺省target Yes
    basedir 用于計算所有其他路徑的基路徑。該屬性可以被basedir property覆蓋。當覆蓋時,該屬性被忽略。如果屬性和basedir property都沒有設定,就使用buildfile文件的父目錄。 No
    項目的描述以一個頂級的<description>元素的形式出現(參看description小節)。

    一個項目可以定義一個或多個target。一個target是一系列你想要執行的。執行Ant時,你可以選擇執行那個target。當沒有給定target時,使用project的default屬性所確定的target。

    3.2 Targets

    一個target可以依賴于其他的target。例如,你可能會有一個target用于編譯程序,一個target用于生成可執行文件。你在生成可執行文件之前必須先編譯通過,所以生成可執行文件的target依賴于編譯target。Ant會處理這種依賴關系。

    然而,應當注意到,Ant的depends屬性只指定了target應該被執行的順序-如果被依賴的target無法運行,這種depends對于指定了依賴關系的target就沒有影響。

    Ant會依照depends屬性中target出現的順序(從左到右)依次執行每個target。然而,要記住的是只要某個target依賴于一個target,后者就會被先執行。
    <target name="A"/>
    <target name="B" depends="A"/>
    <target name="C" depends="B"/>
    <target name="D" depends="C,B,A"/>
    假定我們要執行target D。從它的依賴屬性來看,你可能認為先執行C,然后B,最后A被執行。錯了,C依賴于B,B依賴于A,所以先執行A,然后B,然后C,最后D被執行。

    一個target只能被執行一次,即時有多個target依賴于它(看上面的例子)。

    如果(或如果不)某些屬性被設定,才執行某個target。這樣,允許根據系統的狀態(java version, OS, 命令行屬性定義等等)來更好地控制build的過程。要想讓一個target這樣做,你就應該在target元素中,加入if(或unless)屬性,帶上target因該有所判斷的屬性。例如:
    <target name="build-module-A" if="module-A-present"/>
    <target name="build-own-fake-module-A" unless="module-A-present"/>
    如果沒有if或unless屬性,target總會被執行。

    可選的description屬性可用來提供關于target的一行描述,這些描述可由-projecthelp命令行選項輸出。

    將你的tstamp task在一個所謂的初始化target是很好的做法,其他的target依賴這個初始化target。要確保初始化target是出現在其他target依賴表中的第一個target。在本手冊中大多數的初始化target的名字是"init"。

    target有下面的屬性:
    Attribute Description Required
    name target的名字 Yes
    depends 用逗號分隔的target的名字列表,也就是依賴表。 No
    if 執行target所需要設定的屬性名。 No
    unless 執行target需要清除設定的屬性名。 No
    description 關于target功能的簡短描述。 No

    3.3 Tasks

    一個task是一段可執行的代碼。

    一個task可以有多個屬性(如果你愿意的話,可以將其稱之為變量)。屬性只可能包含對property的引用。這些引用會在task執行前被解析。

    下面是Task的一般構造形式:
    <name attribute1="value1" attribute2="value2" ... />
    這里name是task的名字,attributeN是屬性名,valueN是屬性值。

    有一套內置的(built-in)task,以及一些可選task,但你也可以編寫自己的task。

    所有的task都有一個task名字屬性。Ant用屬性值來產生日志信息。

    可以給task賦一個id屬性:
    <taskname id="taskID" ... />
    這里taskname是task的名字,而taskID是這個task的唯一標識符。通過這個標識符,你可以在腳本中引用相應的task。例如,在腳本中你可以這樣:
    <script ... >
    task1.setFoo("bar");
    </script>
    設定某個task實例的foo屬性。在另一個task中(用java編寫),你可以利用下面的語句存取相應的實例。
    project.getReference("task1").
    注意1:如果task1還沒有運行,就不會被生效(例如:不設定屬性),如果你在隨后配置它,你所作的一切都會被覆蓋。

    注意2:未來的Ant版本可能不會兼容這里所提的屬性,因為很有可能根本沒有task實例,只有proxies。

    3.4 Properties

    一個project可以有很多的properties。可以在buildfile中用property task來設定,或在Ant之外設定。一個property有一個名字和一個值。property可用于task的屬性值。這是通過將屬性名放在"${"和"}"之間并放在屬性值的位置來實現的。例如如果有一個property builddir的值是"build",這個property就可用于屬性值:${builddir}/classes。這個值就可被解析為build/classes。

    內置屬性

    如果你使用了<property> task 定義了所有的系統屬性,Ant允許你使用這些屬性。例如,${os.name}對應操作系統的名字。

    要想得到系統屬性的列表可參考the Javadoc of System.getProperties。

    除了Java的系統屬性,Ant還定義了一些自己的內置屬性:
    basedir project基目錄的絕對路徑 (與<project>的basedir屬性一樣)。
    ant.file buildfile的絕對路徑。
    ant.version Ant的版本。
    ant.project.name 當前執行的project的名字;由<project>的name屬性設定.
    ant.java.version Ant檢測到的JVM的版本; 目前的值有"1.1", "1.2", "1.3" and "1.4".

    例子
    <project name="MyProject" default="dist" basedir=".">

    <!-- set global properties for this build -->
    <property name="src" value="."/>
    <property name="build" value="build"/>
    <property name="dist" value="dist"/>

    <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
    </target>

    <target name="compile" depends="init">
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}"/>
    </target>

    <target name="dist" depends="compile">
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}/lib"/>
    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
    <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
    </target>

    <target name="clean">
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
    </target>

    </project>
    3.5 Path-like Structures
    你可以用":"和";"作為分隔符,指定類似PATH和CLASSPATH的引用。Ant會把分隔符轉換為當前系統所用的分隔符。

    當需要指定類似路徑的值時,可以使用嵌套元素。一般的形式是
    <classpath>
    <pathelement path="${classpath}"/>
    <pathelement location="lib/helper.jar"/>
    </classpath>
    location屬性指定了相對于project基目錄的一個文件和目錄,而path屬性接受逗號或分號分隔的一個位置列表。path屬性一般用作預定義的路徑--其他情況下,應該用多個location屬性。

    為簡潔起見,classpath標簽支持自己的path和location屬性。所以:
    <classpath>
    <pathelement path="${classpath}"/>
    </classpath>
    可以被簡寫作:
    <classpath path="${classpath}"/>
    也可通過<fileset>元素指定路徑。構成一個fileset的多個文件加入path-like structure的順序是未定的。
    <classpath>
    <pathelement path="${classpath}"/>
    <fileset dir="lib">
    <include name="**/*.jar"/>
    </fileset>
    <pathelement location="classes"/>
    </classpath>
    上面的例子構造了一個路徑值包括:${classpath}的路徑,跟著lib目錄下的所有jar文件,接著是classes目錄。

    如果你想在多個task中使用相同的path-like structure,你可以用<path>元素定義他們(與target同級),然后通過id屬性引用--參考Referencs例子。

    path-like structure可能包括對另一個path-like structurede的引用(通過嵌套<path>元素):
    <path id="base.path">
    <pathelement path="${classpath}"/>
    <fileset dir="lib">
    <include name="**/*.jar"/>
    </fileset>
    <pathelement location="classes"/>
    </path>
    <path id="tests.path">
    <path refid="base.path"/>
    <pathelement location="testclasses"/>
    </path>
    前面所提的關于<classpath>的簡潔寫法對于<path>也是有效的,如:
    <path id="tests.path">
    <path refid="base.path"/>
    <pathelement location="testclasses"/>
    </path>
    可寫成:
    <path id="base.path" path="${classpath}"/>
    命令行變量

    有些task可接受參數,并將其傳遞給另一個進程。為了能在變量中包含空格字符,可使用嵌套的arg元素。
    Attribute Description Required
    value 一個命令行變量;可包含空格字符。 只能用一個
    line 空格分隔的命令行變量列表。
    file 作為命令行變量的文件名;會被文件的絕對名替代。
    path 一個作為單個命令行變量的path-like的字符串;或作為分隔符,Ant會將其轉變為特定平臺的分隔符。

    例子
    <arg value="-l -a"/>
    是一個含有空格的單個的命令行變量。
    <arg line="-l -a"/>
    是兩個空格分隔的命令行變量。
    <arg path="/dir;/dir2:\dir3"/>
    是一個命令行變量,其值在DOS系統上為\dir;\dir2;\dir3;在Unix系統上為/dir:/dir2:/dir3 。

    References

    buildfile元素的id屬性可用來引用這些元素。如果你需要一遍遍的復制相同的XML代碼塊,這一屬性就很有用--如多次使用<classpath>結構。

    下面的例子:
    <project ... >
    <target ... >
    <rmic ...>
    <classpath>
    <pathelement location="lib/"/>
    <pathelement path="${java.class.path}/"/>
    <pathelement path="${additional.path}"/>
    </classpath>
    </rmic>
    </target>
    <target ... >
    <javac ...>
    <classpath>
    <pathelement location="lib/"/>
    <pathelement path="${java.class.path}/"/>
    <pathelement path="${additional.path}"/>
    </classpath>
    </javac>
    </target>
    </project>
    可以寫成如下形式:
    <project ... >
    <path id="project.class.path">
    <pathelement location="lib/"/>
    <pathelement path="${java.class.path}/"/>
    <pathelement path="${additional.path}"/>
    </path>
    <target ... >
    <rmic ...>
    <classpath refid="project.class.path"/>
    </rmic>
    </target>
    <target ... >
    <javac ...>
    <classpath refid="project.class.path"/>
    </javac>
    </target>
    </project>
    所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受這種類型的引用。

    ?

    4.1 File(Directory)類
    4.1.1 Mkdir
    ? 創建一個目錄,如果他的父目錄不存在,也會被同時創建。
    ? 例子:
    <mkdir dir="build/classes"/>
    ? 說明: 如果build不存在,也會被同時創建
    4.1.2 Copy
    ? 拷貝一個(組)文件、目錄
    ? 例子:
    1. 拷貝單個的文件:
    <copy file="myfile.txt" tofile="mycopy.txt"/>
    2. 拷貝單個的文件到指定目錄下
    <copy file="myfile.txt" todir="../some/other/dir"/>
    3. 拷貝一個目錄到另外一個目錄下
    <copy todir="../new/dir">
    <fileset dir="src_dir"/>
    </copy>
    4. 拷貝一批文件到指定目錄下
    <copy todir="../dest/dir">
    <fileset dir="src_dir">
    <exclude name="**/*.java"/>
    </fileset>
    </copy>

    <copy todir="../dest/dir">
    <fileset dir="src_dir" excludes="**/*.java"/>
    </copy>
    5. 拷貝一批文件到指定目錄下,將文件名后增加。Bak后綴
    <copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <mapper type="glob" from="*" to="*.bak"/>
    </copy>
    6. 拷貝一組文件到指定目錄下,替換其中的@標簽@內容
    <copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <filterset>
    <filter token="TITLE" value="Foo Bar"/>
    </filterset>
    </copy>
    4.1.3 Delete
    ? 刪除一個(組)文件或者目錄
    ? 例子
    1. 刪除一個文件
    <delete file="/lib/ant.jar"/>
    2. 刪除指定目錄及其子目錄
    <delete dir="lib"/>
    3. 刪除指定的一組文件
    <delete>
    <fileset dir="." includes="**/*.bak"/>
    </delete>
    4. 刪除指定目錄及其子目錄,包括他自己
    <delete includeEmptyDirs="true">
    <fileset dir="build"/>
    </delete>
    4.1.4 Move
    ? 移動或重命名一個(組)文件、目錄
    ? 例子:
    1. 移動或重命名一個文件
    <move file="file.orig" tofile="file.moved"/>
    2. 移動或重命名一個文件到另一個文件夾下面
    <move file="file.orig" todir="dir/to/move/to"/>
    3. 將一個目錄移到另外一個目錄下
    <move todir="new/dir/to/move/to">
    <fileset dir="src/dir"/>
    </move>
    4. 將一組文件移動到另外的目錄下
    <move todir="some/new/dir">
    <fileset dir="my/src/dir">
    <include name="**/*.jar"/>
    <exclude name="**/ant.jar"/>
    </fileset>
    </move>
    5. 移動文件過程中增加。Bak后綴
    <move todir="my/src/dir">
    <fileset dir="my/src/dir">
    <exclude name="**/*.bak"/>
    </fileset>
    <mapper type="glob" from="*" to="*.bak"/>
    </move>

    ?


    4.2 Java相關
    4.2.1 Javac
    ? 編譯java原代碼
    ? 例子
    1. <javac srcdir="${src}"
    destdir="${build}"
    classpath="xyz.jar"
    debug="on"
    />
    編譯${src}目錄及其子目錄下的所有。Java文件,。Class文件將放在${build}指定的目錄下,classpath表示需要用到的類文件或者目錄,debug設置為on表示輸出debug信息
    2. <javac srcdir="${src}:${src2}"
    destdir="${build}"
    includes="mypackage/p1/**,mypackage/p2/**"
    excludes="mypackage/p1/testpackage/**"
    classpath="xyz.jar"
    debug="on"
    />
    編譯${src}和${src2}目錄及其子目錄下的所有。Java文件,但是package/p1/**,mypackage/p2/**將被編譯,而mypackage/p1/testpackage/**將不會被編譯。Class文件將放在${build}指定的目錄下,classpath表示需要用到的類文件或者目錄,debug設置為on表示輸出debug信息
    3. <property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/>

    <javac srcdir="${src}"
    destdir="${src}"
    classpath="${classpath}"
    debug="on"
    />
    路徑是在property中定義的
    4.2.2 java
    ? 執行指定的java類


    ? 例子:
    1. <java classname="test.Main">
    <classpath>
    <pathelement location="dist/test.jar"/>
    <pathelement path="${java.class.path}"/>
    </classpath>
    </java>
    classname中指定要執行的類,classpath設定要使用的環境變量
    2. <path id="project.class.path">
    <pathelement location="lib/"/>
    <pathelement path="${java.class.path}/"/>
    <pathelement path="${additional.path}"/>
    </path>

    <target ... >
    <rmic ...>
    <classpath refid="project.class.path"/>
    </rmic>
    </target>

    ?

    ?

    4.3 打包相關
    4.3.1 jar
    ? 將一組文件打包
    ? 例子:
    1. <jar destfile="${dist}/lib/app.jar" basedir="${build}/classes"/>
    將${build}/classes下面的所有文件打包到${dist}/lib/app.jar中
    2. <jar destfile="${dist}/lib/app.jar"
    basedir="${build}/classes"
    includes="mypackage/test/**"
    excludes="**/Test.class"
    />
    將${build}/classes下面的所有文件打包到${dist}/lib/app.jar中,但是包括mypackage/test/所有文件不包括所有的Test.class
    3. <jar destfile="${dist}/lib/app.jar"
    basedir="${build}/classes"
    includes="mypackage/test/**"
    excludes="**/Test.class"
    manifest=”my.mf”
    />
    manifest屬性指定自己的META-INF/MANIFEST.MF文件,而不是由系統生成
    4.3.2 war
    ? 對Jar的擴展,用于打包Web應用
    ? 例子:
    ? 假設我們的文件目錄如下:
    thirdparty/libs/jdbc1.jar
    thirdparty/libs/jdbc2.jar
    build/main/com/myco/myapp/Servlet.class
    src/metadata/myapp.xml
    src/html/myapp/index.html
    src/jsp/myapp/front.jsp
    src/graphics/images/gifs/small/logo.gif
    src/graphics/images/gifs/large/logo.gif
    ? 下面是我們的任務的內容:
    <war destfile="myapp.war" webxml="src/metadata/myapp.xml">
    <fileset dir="src/html/myapp"/>
    <fileset dir="src/jsp/myapp"/>
    <lib dir="thirdparty/libs">
    <exclude name="jdbc1.jar"/>
    </lib>
    <classes dir="build/main"/>
    <zipfileset dir="src/graphics/images/gifs"
    prefix="images"/>
    </war>
    ? 完成后的結果:
    WEB-INF/web.xml
    WEB-INF/lib/jdbc2.jar
    WEB-INF/classes/com/myco/myapp/Servlet.class
    META-INF/MANIFEST.MF
    index.html
    front.jsp
    images/small/logo.gif
    images/large/logo.gif
    4.3.3 ear
    ? 用于打包企業應用
    ? 例子
    <ear destfile="${build.dir}/myapp.ear" appxml="${src.dir}/metadata/application.xml">
    <fileset dir="${build.dir}" includes="*.jar,*.war"/>
    </ear>

    ?

    4.4 時間戳
    在生成環境中使用當前時間和日期,以某種方式標記某個生成任務的輸出,以便記錄它是何時生成的,這經常是可取的。這可能涉及編輯一個文件,以便插入一個字符串來指定日期和時間,或將這個信息合并到 JAR 或 zip 文件的文件名中。
    這種需要是通過簡單但是非常有用的 tstamp 任務來解決的。這個任務通常在某次生成過程開始時調用,比如在一個 init 目標中。這個任務不需要屬性,許多情況下只需 <tstamp/> 就足夠了。
    tstamp 不產生任何輸出;相反,它根據當前系統時間和日期設置 Ant 屬性。下面是 tstamp 設置的一些屬性、對每個屬性的說明,以及這些屬性可被設置到的值的例子:
    屬性 說明 例子
    DSTAMP 設置為當前日期,默認格式為yyyymmdd 20031217
    TSTAMP 設置為當前時間,默認格式為 hhmm 1603
    TODAY 設置為當前日期,帶完整的月份 2003 年 12 月 17 日
    例如,在前一小節中,我們按如下方式創建了一個 JAR 文件:

    <jar destfile="package.jar" basedir="classes"/>

    在調用 tstamp 任務之后,我們能夠根據日期命名該 JAR 文件,如下所示:

    <jar destfile="package-${DSTAMP}.jar" basedir="classes"/>

    因此,如果這個任務在 2003 年 12 月 17 日調用,該 JAR 文件將被命名為 package-20031217.jar。
    還可以配置 tstamp 任務來設置不同的屬性,應用一個當前時間之前或之后的時間偏移,或以不同的方式格式化該字符串。所有這些都是使用一個嵌套的 format 元素來完成的,如下所示:

    <tstamp>
    <format property="OFFSET_TIME"
    pattern="HH:mm:ss"
    offset="10" unit="minute"/>
    </tstamp>

    上面的清單將 OFFSET_TIME 屬性設置為距離當前時間 10 分鐘之后的小時數、分鐘數和秒數。
    用于定義格式字符串的字符與 java.text.SimpleDateFormat 類所定義的那些格式字符相同

    ?

    4.5 執行SQL語句
    ? 通過jdbc執行SQL語句
    ? 例子:
    1. <sql
    driver="org.gjt.mm.mysql.Driver"
    url="jdbc:mysql://localhost:3306/mydb"
    userid="root"
    password="root"
    src="data.sql"
    />
    2. <sql
    driver="org.database.jdbcDriver"
    url="jdbc:database-url"
    userid="sa"
    password="pass"
    src="data.sql"
    rdbms="oracle"
    version="8.1."
    >
    </sql>
    只有在oracle、版本是8.1的時候才執行

    ?

    4.6 發送郵件
    ? 使用SMTP服務器發送郵件
    ? 例子:
    <mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build">
    <from address="me@myisp.com"/>
    <to address="all@xyz.com"/>
    <message>The ${buildname} nightly build has completed</message>
    <fileset dir="dist">
    <includes name="**/*.zip"/>
    </fileset>
    </mail>
    ? mailhost: SMTP服務器地址
    ? mailport: 服務器端口
    ? subject: 主題
    ? from: 發送人地址
    ? to: 接受人地址
    ? message: 發送的消息
    ? fileset: 設置附件?


    posted @ 2008-11-07 09:22 sanwish 閱讀(169) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 免费va人成视频网站全| 一级做a爰片久久毛片免费陪| 亚洲中久无码不卡永久在线观看| 可以免费看黄视频的网站| 好久久免费视频高清| 免费国产污网站在线观看不要卡| 亚洲中文字幕无码久久| 亚洲精品电影天堂网| 亚洲AV日韩AV高潮无码专区| 亚洲国产一区视频| 免费观看四虎精品国产永久| 免费国产作爱视频网站| 在线人成精品免费视频| 久久精品视频免费看| 西西人体免费视频| 男女拍拍拍免费视频网站| 免费国产a理论片| 男男gay做爽爽的视频免费| 亚洲日韩乱码中文字幕| jlzzjlzz亚洲jzjzjz| 亚洲区精品久久一区二区三区| 亚洲黄色免费网址| 亚洲三级电影网站| 国产亚洲精品va在线| 久久精品国产亚洲综合色| 亚洲深深色噜噜狠狠爱网站| 亚洲乱码精品久久久久..| 国产国拍精品亚洲AV片| 国产亚洲精品自在线观看| 国产亚洲精品看片在线观看| 国产亚洲一区二区手机在线观看 | 亚洲国产日韩一区高清在线| 亚洲精品白浆高清久久久久久| 国产专区一va亚洲v天堂| 亚洲桃色AV无码| 婷婷亚洲久悠悠色悠在线播放| 色婷婷六月亚洲婷婷丁香| 亚洲精品高清国产麻豆专区| 久久久久se色偷偷亚洲精品av | 可以免费看黄视频的网站| 免费激情视频网站|