您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源單元測(cè)試工具 >
在 Eclipse 中使用 Maven
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/7/8 11:40:08 ] 推薦標(biāo)簽:

Maven 將作為一個(gè)普通的構(gòu)建系統(tǒng),被人們重新認(rèn)識(shí),并且它將超越 Java™ 技術(shù)。本文不打算成為一篇 Maven 教程,而是將 Maven 與其他技術(shù)進(jìn)行比較,讓您洞察 Maven 與 Eclipse 相適應(yīng)的地方,以及如何使這些工具相互協(xié)作。

在過(guò)去幾年中,Maven 已經(jīng)不僅僅是 Java 世界的一個(gè)時(shí)髦話題。自 2001 年起,Maven 已經(jīng)成為構(gòu)建工具領(lǐng)域的先驅(qū)。近幾年,人們常拿它與 Ant 比較。因?yàn)?Maven 與 Ant 有一些顯而易見的相似之處,所以拿它們倆作比較似乎是很自然的事。比如說(shuō),在兩種情況下,XML 腳本都是可用的;兩種工具都可以生產(chǎn)工件;它們還可以共享相同的分類法和概念,比如 項(xiàng)目(project)、目標(biāo)(target)與 目標(biāo)(goal),以及 依賴關(guān)系(depends) 和 先決條件(prereqs)。但它們實(shí)質(zhì)上有很大的差別。Ant 只是一個(gè) XML 腳本工具,而 Maven 是一個(gè)普通的構(gòu)建工具,它關(guān)注的重點(diǎn)是一個(gè)叫做項(xiàng)目對(duì)象模型(POM)的概念。POM 暴露的是粗粒度的、面向構(gòu)建的任務(wù),這些任務(wù)被稱為目標(biāo),它們提供了一些準(zhǔn)則,幫助您開發(fā)構(gòu)建方法和實(shí)現(xiàn)佳實(shí)踐。

在某些方面,Maven 屬于軟件工廠 工具家族(參閱 參考資料),盡管目前它仍在外圍。更確切地說(shuō),諸如 Maven 之類的構(gòu)建工具是軟件工廠領(lǐng)域中必不可少的。

 

軟件工廠

通過(guò)顯著提高自動(dòng)開發(fā)的級(jí)別,軟件工廠提供了一個(gè)花費(fèi)更少、更靈活的應(yīng)用程序開發(fā)方法。根據(jù) Software Factories Web 站點(diǎn)的說(shuō)法,“軟件工廠是一個(gè)軟件產(chǎn)品線,它根據(jù)構(gòu)建特殊種類的應(yīng)用程序的方法,配置一些可擴(kuò)展的開發(fā)工具……提供打包的內(nèi)容……以及指導(dǎo)”(參閱 參考資料)。軟件工廠涉及三個(gè)主要概念:

    模式,提供了一些元數(shù)據(jù),描述組成應(yīng)用程序的不同工件的結(jié)構(gòu),以及它們是如何交互的。
    一個(gè)或多個(gè)模板,提供了啟動(dòng)程序工具箱,以及構(gòu)建應(yīng)用程序所需的其他任何東西。
    可擴(kuò)展的開發(fā)環(huán)境,用于配置、定制和裝配組件。

如今,這類工具已經(jīng)逐漸引起了認(rèn)識(shí)到它們的價(jià)值的那些工具制造人員、工具開發(fā)人員和軟件編輯的注意。這些工具促進(jìn)了軟件開發(fā)過(guò)程的工業(yè)化,降低了投入市場(chǎng)的成本和時(shí)間,同時(shí)還提高了生產(chǎn)率,加快了對(duì)進(jìn)化需求的反應(yīng)。

仔細(xì)查看一下 Maven 的主要特性,您會(huì)認(rèn)識(shí)到 Maven 與軟件工廠之間的相似之處:Maven 使用 POM 作為元數(shù)據(jù)來(lái)描述項(xiàng)目結(jié)構(gòu),并通過(guò)通用應(yīng)用程序插件來(lái)獲得可擴(kuò)展的項(xiàng)目模板。因?yàn)?Maven 非常靈活并且是開放源碼的,所以很容易推斷和設(shè)想 Maven 是軟件工廠平臺(tái)中的一個(gè)核心組件。但是,還有另一種說(shuō)法。上述類比并不完全,因?yàn)槟壳暗?Maven 缺乏專用的開發(fā)環(huán)境,而這類環(huán)境有助于創(chuàng)建特定于域或特定于企業(yè)的插件和模板,并允許您輕松地配置項(xiàng)目或定制行為。

不過(guò),Maven 的主要目標(biāo)是標(biāo)準(zhǔn)化構(gòu)建過(guò)程,并保證代碼構(gòu)建-測(cè)試-部署(CBTD)循環(huán)中的質(zhì)量和易再現(xiàn)性(easy reproducibility)。它還可以制定度量標(biāo)準(zhǔn),幫助您了解開發(fā)狀態(tài)。CBTD 本體論在軟件工程領(lǐng)域已經(jīng)不再新鮮,但 Maven 可以使您標(biāo)準(zhǔn)化這種本體論,并通過(guò)抽象這種理論,將它想像成一個(gè)完整的實(shí)體?紤]到不斷增長(zhǎng)的項(xiàng)目的復(fù)雜性,標(biāo)準(zhǔn)化成為一種迫切需要。擴(kuò)建 的概念,我們稱之為元構(gòu)建,因?yàn)槠錈o(wú)可估量的價(jià)值以及保證下一級(jí)質(zhì)量的特性,正逐漸被人們認(rèn)識(shí)。持續(xù)集成(continuous integration)是建立在這個(gè)概念的基礎(chǔ)之上,但它也應(yīng)用了在 IDE 上下文之外的地方進(jìn)行構(gòu)建的能力。

模糊的界限

使用過(guò) Java 技術(shù)的人應(yīng)該都聽說(shuō)過(guò) Eclipse。2001 年年中的時(shí)候,Eclipse 推出了它的第一個(gè)版本,標(biāo)志其成熟的是它為集成開發(fā)環(huán)境(IDE)提供了一個(gè)機(jī)會(huì),特別是為 Java 開發(fā)人員(不嚴(yán)謹(jǐn)?shù)卣f(shuō))提供了一個(gè)機(jī)會(huì)。Eclipse 是一種開放的、以語(yǔ)言為中心的平臺(tái),也可以將它用作教育性項(xiàng)目和研究項(xiàng)目的基礎(chǔ)平臺(tái),其中一些平臺(tái)捐贈(zèng)給了 Eclipse 團(tuán)體( 請(qǐng)參閱 參考資料)。像 Microsoft® 已經(jīng)采用軟件工廠方法一樣,Eclipse 也開始轉(zhuǎn)向模型驅(qū)動(dòng)開發(fā)(MDD)方向,并且近已經(jīng)公布了一個(gè)新的項(xiàng)目提議 —— 模型驅(qū)動(dòng)的開發(fā)集成(MDDi)。根據(jù)該提議,“Eclipse MDDi 項(xiàng)目專用于平臺(tái)的實(shí)現(xiàn)……其設(shè)計(jì)目標(biāo)是支持各種建模語(yǔ)言(統(tǒng)一建模語(yǔ)言或特定于域的語(yǔ)言)和模型驅(qū)動(dòng)的技術(shù)。”

漸漸地,一些工具開始假定某些特性可以完全并且順利地集成在一起,Maven 和 Eclipse(即使作為一個(gè)簡(jiǎn)單的 IDE)也不例外。因此,從構(gòu)建的角度來(lái)看,二者似乎出現(xiàn)了重疊,如圖 1 所示。


圖 1. 擴(kuò)建的概念

圖 1 描述的實(shí)際上是以前討論的擴(kuò)建概念。正如以前定義的那樣,整個(gè)擴(kuò)建過(guò)程包括幾個(gè)任務(wù),同時(shí)還表示了一個(gè)元構(gòu)建實(shí)例。任務(wù)可以是以下兩種類型之一:原子任務(wù)是細(xì)粒度的,并且是上下文不明確的,這種任務(wù)的兩個(gè)實(shí)例幾乎是相同的;宏觀任務(wù)是復(fù)合任務(wù),它充當(dāng)微觀任務(wù)的容器。

構(gòu)建,從擴(kuò)展的意義上說(shuō),只處理宏觀任務(wù);原子任務(wù)的觸發(fā)取決于配置。這意味著用戶對(duì)系統(tǒng)有著較高層次的看法,這使得系統(tǒng)更易于維護(hù)和發(fā)展。

此外,Maven 和 Eclipse 都是開放的,并且很容易通過(guò)插件擴(kuò)展它們,使其滿足您的需要。但是,因?yàn)樗鼈冡槍?duì)的受眾不同,所以它們之間的相似性也到此為止:多數(shù) Eclipse 終用戶是一些開發(fā)人員;而 Maven 主要針對(duì)的是一些構(gòu)建管理人員。盡管如此,Maven 仍然是一個(gè)命令行工具。雖然圖形用戶界面(GUI)是按照 Jason Van Zyl(Maven 的制造者和架構(gòu)師)指示的方向開發(fā)的,但 Maven 目前仍然沒(méi)有幫助用戶執(zhí)行特殊任務(wù)的特定 GUI,比如創(chuàng)建或更新配置,或者只用一個(gè)鼠標(biāo)單擊發(fā)起構(gòu)建。

上面描述的典型構(gòu)建順序在 Eclipse 中不像在 Maven 中那么順利。Eclipse 的特性之一是開發(fā) 環(huán)境造成構(gòu)建過(guò)程不連續(xù),這要?dú)w因于一些人為因素:并不是每次成功編譯之后都進(jìn)行測(cè)試、所有測(cè)試沒(méi)必要一次運(yùn)行、可以跳過(guò)一些微觀任務(wù),等等。各種因素都會(huì)導(dǎo)致產(chǎn)生差異,這是為什么開發(fā)人員每天至少必須運(yùn)行一次完整的構(gòu)建過(guò)程,以確信他們沒(méi)有破壞什么的原因。

不過(guò),因?yàn)?Eclipse 是一個(gè)可擴(kuò)展平臺(tái),所以它受到許多用戶社區(qū)的支持,這使它成為駐留 Maven 驅(qū)動(dòng)的開發(fā)、允許開發(fā)人員和構(gòu)建管理人員以某種簡(jiǎn)單的方式進(jìn)行協(xié)作的理想之地。

 

將 Maven 集成到 Eclipse 中

Mevenide 是 Codehaus 主辦的一個(gè)項(xiàng)目,旨在通過(guò)將 Maven 集成到 IDE 中,簡(jiǎn)化 Maven 的使用(參閱 參考資料),F(xiàn)在,Borland Software 的 JBuilder、NetBeans 和 Eclipse 都受到支持。其他一些項(xiàng)目也部分地將 Maven 集成到 Eclipse 中,這樣,可以與 Mevenide(如 Maven Workshop)共享一些特性。除了增加 Maven 的易用性之外,為什么需要這種插件?

通過(guò)提供一些工具和視圖,讓您了解 Maven 隱藏的復(fù)雜性并改進(jìn)團(tuán)隊(duì)環(huán)境中的協(xié)作,Mevenide for Eclipse 提高了生產(chǎn)率。從協(xié)作的角度來(lái)看,假如構(gòu)建已經(jīng)被 Maven 化了,那么有用的特性是 Eclipse 項(xiàng)目元數(shù)據(jù)與 Maven 元數(shù)據(jù)之間的雙向同步。如果開發(fā)人員忘記在向 Eclipse 中添加一個(gè)依賴關(guān)系之后更新 POM,那么該怎么辦?如果重構(gòu)無(wú)法傳播到 Maven,該怎么辦?構(gòu)建可能會(huì)中斷,或者一些單元測(cè)試可能被拒絕,因此,真的需要使 Eclipse 元數(shù)據(jù)和 Maven 元數(shù)據(jù)保持同步。Mevenide 監(jiān)聽元數(shù)據(jù)的變化,并使您能夠很容易地確定元數(shù)據(jù)不匹配的地方,這可以防止進(jìn)行被嚴(yán)重破壞的構(gòu)建。

但 POM 并不只是關(guān)于依賴關(guān)系和項(xiàng)目布局的。它還包含一些不用于結(jié)構(gòu)上的項(xiàng)目管理信息,比如版本號(hào)、名稱、ID 和源儲(chǔ)存庫(kù)的位置。Eclipse 元數(shù)據(jù)并不總是反映所有這些信息。因此,需要另一個(gè)編輯這些信息的方法。為此,Mevenide 提供了一個(gè)圖形編輯器,該編輯器使 POM 的維護(hù)變得更容易,并允許您避開一些煩瑣的、容易出錯(cuò)的原始 XML 手工編輯。每個(gè) POM 語(yǔ)義部分都被表示為一個(gè)編輯器頁(yè),這增強(qiáng)了模型的整體可靠性。此外,為了大限度地減少創(chuàng)建 POM 的無(wú)聊過(guò)程,Mevenide 提供了一個(gè)相當(dāng)簡(jiǎn)單的、可擴(kuò)展的 POM 模板機(jī)制。

阻止 Maven 在 Eclipse 之外的地方運(yùn)行的能力是從類似 Mevenide 的插件中容易獲得的一項(xiàng)功能。您可以選擇某些執(zhí)行任務(wù)(用 Maven 的術(shù)語(yǔ)來(lái)講是 目標(biāo)),這些任務(wù)可以是通過(guò) Maven 插件全局定義的任務(wù),也可以是依賴于項(xiàng)目的任務(wù),或者,您可以通過(guò)定義構(gòu)建敏感的變量來(lái)定制構(gòu)建。Eclipse 控制臺(tái)上只顯示了一些相關(guān)的選項(xiàng)(即在 IDE 的上下文中相關(guān)),對(duì)于其他任何插件,控制臺(tái)上只輸出構(gòu)建日志。這一特性非常重要,因?yàn)樗苊饬嗽诳刂婆_(tái)與 Eclipse 之間不停地來(lái)回奔波。

Mevenide 還集成了其他許多幫助方法特性,但它們不是很重要。例如,您可以定義給定目標(biāo)與文件模式之間的關(guān)系,這樣,可以根據(jù)工作空間增加的增量來(lái)激活那些任務(wù)。您還可以瀏覽工件儲(chǔ)存庫(kù),或者根據(jù)名稱搜索某個(gè)給定的工件(一個(gè)工件 是一個(gè)構(gòu)建結(jié)果,它可以是 JAR 文件、可執(zhí)行文件或者是一個(gè)完整的 Web 站點(diǎn))。然后,可以重定向到 Mevenide 站點(diǎn),獲得完整的特性列表。

不過(guò),仍然還有一個(gè)問(wèn)題:即使 Mevenide 增強(qiáng)了生產(chǎn)率和易用性,但您仍然必須認(rèn)識(shí)到哪些工具可以在特殊環(huán)境中滿足您的需要。通過(guò) Maven Console 運(yùn)行 Maven 會(huì)話可能非常耗時(shí),所以,為了獲得較高的生產(chǎn)率,在對(duì)會(huì)話進(jìn)行編碼期間,應(yīng)該改為使用 JUnit 集成的 Eclipse 支持來(lái)運(yùn)行測(cè)試,并依賴于 Eclipse 的內(nèi)部編譯器來(lái)生成可執(zhí)行的文件。但在向源代碼儲(chǔ)存庫(kù)提交任何東西之前,應(yīng)該確保 POM 是同步的,并回滾所有不需要的 .classpath 或 .project 修改 —— 也是說(shuō),假設(shè)這些文件都是在源代碼控制之下,這可能是有爭(zhēng)議的。這個(gè)話題在 Martin Van den Bemt 的 blog 中討論過(guò)(參閱 參考資料)。

 

結(jié)束語(yǔ)

盡管 Maven 和 Eclipse 具有不同的特性,但從構(gòu)建的角度看,它們?cè)谀承┑胤娇赡艹霈F(xiàn)重疊。它們之間存在的對(duì)立似乎也相當(dāng)多,但我們很容易克服這些,通過(guò)努力終使它們相互協(xié)作,共創(chuàng)一片沃土。諸如 Mevenide 之類的工具可以使 Maven 和 Eclipse 順利合作,并使它們保持同步,但您必須認(rèn)識(shí)到,在某一個(gè)給定的開發(fā)階段,哪種工具能滿足您的需要。

盡管 Maven 作為質(zhì)量保證過(guò)程中的一個(gè)重要因素,正逐漸被人們所認(rèn)可,但在將它集成到開發(fā)環(huán)境(尤其是 Eclipse)中,使 Maven 成為一等 IDE 公民這一點(diǎn)上,還有待提高。到那時(shí),我們可以考慮其他的 Maven 用例,比如說(shuō),更進(jìn)一步地將它集成到全局開發(fā)過(guò)程中,以及像 Eclipse 這樣的可擴(kuò)展環(huán)境如何幫助實(shí)現(xiàn)這些集成。

本系列的下一部分將更詳細(xì)地查看 Mevenide 的能力,以及如何使用該工具實(shí)現(xiàn)佳實(shí)踐,并從 Maven 和 Eclipse 中獲得大好處。

軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd