2006 年 2 月 23 日
本文主要闡述 Maven2 的新特性,這些新特性可以大大地縮短了開(kāi)發(fā)管理中的工作量,使得開(kāi)發(fā)人員將精力集中在實(shí)際的業(yè)務(wù)問(wèn)題上。
Maven 出現到現在也有很長(cháng)時(shí)間了,初識它的感覺(jué)至今仍清晰的印在腦海中?,F在想來(lái),當時(shí)從 Ant 移情 Maven 的想法其實(shí)很樸素,就是因為 Maven 可以以網(wǎng)站的形式展現與項目相關(guān)的信息,如開(kāi)發(fā)人員列表、各種 Report。這種方式為項目的構建帶來(lái)了極大的方便,尤其是 Report 的。試想對于產(chǎn)生的 Junit-Report、JavaDoc、CheckStyle、PMD 等報告,如果沒(méi)有一個(gè)統一的入口,每次切換目錄是多么令人厭煩的事情!
Maven 無(wú)疑是相當成功的,這一點(diǎn)從越來(lái)越多的開(kāi)源項目開(kāi)始使用 Maven 就可以看出。Maven 取得成功的原因很簡(jiǎn)單:在簡(jiǎn)化構建腳本的同時(shí),功能并沒(méi)有縮水,反而有所增強;提供匯集項目信息的工具,并以相當友好的方式呈現;豐富的插件簡(jiǎn)化了工作。 如此有力的工具出現,自然是爭相使用。
如今 Maven2 已經(jīng)推出,Maven 的官方網(wǎng)站稱(chēng),Maven2 相對于 Maven1 是一個(gè)相當大的轉變,甚至不惜犧牲兼容性來(lái)達到這一目的。(為了 Maven1 的用戶(hù)著(zhù)想,Maven1 仍在繼續他的使命。)如此大的變動(dòng)到底換來(lái)了什么樣的結果?
比起 Maven1 那不急不慢的運行速度,Maven2在速度上有了質(zhì)的飛躍,甚至與Ant相比也毫不遜色(當然,下載不算)。除此之外,"簡(jiǎn)化工作,使用業(yè)界公認的最佳實(shí) 踐"也是是 Maven2 的另一大主題,其他的新特性無(wú)處不在體現 Maven2 為簡(jiǎn)化工作而做出的努力。
Maven1 和 Maven2 主要配置文件的對比:
POM是Maven的核心對象模型,在Maven2中POM已由project.xml轉移到pom.xml中使用,版本也由3升級為4。對于項目,一般只需要pom.xml就行了。
在Maven2中不需要也不提倡使用maven.xml,原因如下:
如果仍期望能夠使用類(lèi)似maven.xml的功能,如<preGoal>,請參考Inserting non-standard build steps using preGoals and postGoals。
在Maven2中,配置使用settings.xml,它取代了原有的project.properties和build.properties。配置在Maven2中存在兩種級別:
在settings.xml中可以配置,如本地Repository、proxy等等,關(guān)于settings.xml的結構可以從Maven的官方網(wǎng)站上獲取。
在Maven2中,編寫(xiě)plugin的語(yǔ)言由jelly變更為Java和BeanShell。Java在速度上更有優(yōu)勢,而且開(kāi)發(fā)人員的熟悉程度更高。對于其他的流行腳本,如groovy,Maven的官方網(wǎng)站的意見(jiàn)是,等待其更成熟時(shí)再考慮
。好的目錄結構可以使開(kāi)發(fā)人員更容易理解項目,為以后的維護工作也打下良好的基礎。Maven2根據業(yè)界公認的最佳目錄結構,為開(kāi)發(fā)者提供了缺省的標準目錄模板。Maven2的標準目錄結構如下:
使用目錄模板,可以使pom.xml更簡(jiǎn)潔。因為Maven2已經(jīng)根據缺省目錄,預定義了相關(guān)的動(dòng)作,而無(wú)需人工的干預。以resources目錄為例:
這些動(dòng)作在 Maven1 中,是需要在 maven.xml 中使用<preGoal>或<postGoal>來(lái)完成的。如今,完全不需要在pom.xml中指定就能夠自動(dòng)完成。在src和 test都使用resources,方便構建和測試,這種方式本就已是前人的經(jīng)驗。通過(guò)使用Maven2,使這個(gè)經(jīng)驗在開(kāi)發(fā)團隊中得到普及。
創(chuàng )建標準目錄模板,可以通過(guò)如下命令:
|
groupId和artifactId的含義與Maven1中的含義一樣,參數artifactId的值會(huì )作為項目根目錄的名字。除了建立相應的目錄之外,Maven2還會(huì )創(chuàng )建缺省的pom.xml。
Maven2也考慮到:不同類(lèi)型的項目需要擁有不同的目錄結構。如創(chuàng )建web項目,可以使用命令:
|
在Maven2中有了明確的生命周期概念,而且都提供與之對應的命令,使得項目構建更加清晰明了。主要的生命周期階段:
如果要執行項目編譯,那么直接輸入:mvn compile即可,對于其他的階段可以類(lèi)推。階段之間是存在依賴(lài)關(guān)系(dependency)的,如test依賴(lài)test-compile。在執行 mvn test時(shí),會(huì )先運行mvn test-compile,然后才是mvn test。
在POM 4中,<dependency>中還引入了<scope>,它主要管理依賴(lài)的部署。目前<scope>可以使用5個(gè)值:
<scope>的使用舉例:
|
7. 傳遞依賴(lài),簡(jiǎn)化依賴(lài)管理
在Maven1中,需要把依賴(lài)所需要的包也一并列出。這對于使用類(lèi)似如Hibernate的用戶(hù)來(lái)說(shuō)所操的心太多了,而且也不方便。在Maven2 中實(shí)現了傳遞依賴(lài),如此對于Hibernate所依賴(lài)的包,Maven2會(huì )自動(dòng)下載,開(kāi)發(fā)人員只需關(guān)心Hibernate即可。
注意:只有得到Maven支持的依賴(lài),通常是plugin形式出現,才能獲得這個(gè)特性。而且對于一些老的plugin,可能由于時(shí)間的關(guān)系不支持傳 遞依賴(lài)。如至少在Maven 2.0.1中,對于Hibernate 2.1.2,仍然需要顯式列出Hibernate 2.1.2所依賴(lài)的包。
|
安裝Maven2的步驟非常簡(jiǎn)單:首先從Maven官方網(wǎng)站下載相應的軟件包,目前是Maven 2.0.1;然后解壓,并設置環(huán)境變量M2_HOME= Maven2的解壓安裝目錄;最后將%M2_HOME%/bin添加到path中,方便Maven在任何目錄下運行。
Maven2的運行命令是mvn,使用mvn -h可以獲得相關(guān)的幫助信息。常用情形:
或許是由于剛剛推出的緣故,Maven2目前還是有一些不盡如人意的地方。尤其是Report部分的plugin,有的是因為目前還沒(méi)有,如 junit-report。有的則是一些莫名其妙的問(wèn)題,如checktyle和pmd,在本地locale下都無(wú)法正常工作。以pmd舉例,在產(chǎn)生 PMD報告時(shí)會(huì )拋出如下異常:
|
幸運的是,Maven2一出現就備受關(guān)注,要不了多長(cháng)時(shí)間,諸如此類(lèi)的問(wèn)題應該就會(huì )很快解決。
|
Maven2在Maven1的優(yōu)勢基礎之上,又向前邁進(jìn)了一大步。它提供的這些新特性大大地縮短了開(kāi)發(fā)管理中的工作量,使得開(kāi)發(fā)人員將精力集中在實(shí)際的業(yè)務(wù)問(wèn)題上。而且這些新特性對于簡(jiǎn)化使用,普及最佳實(shí)踐,也起到了積極的作用。
|
|
|
胡鍵,西安交通大學(xué)碩士,2000年畢業(yè)后一直從事軟件開(kāi)發(fā)。2002年開(kāi)始使用Java,在平時(shí)的項目開(kāi)發(fā)中經(jīng)常采用OpenSource的工具,如Ant、Maven、Hibernate、Struts等,目前正在研究信息集成方面的規范和技術(shù)??梢酝ㄟ^(guò)jianhgreat@hotmail.com與他取得聯(lián)系,或訪(fǎng)問(wèn)個(gè)人blog:http://blog.donews.com/foxgem/。 |
||
|
胡偉紅,西安交通大學(xué)碩士,目前就職于IBM 區域合作伙伴支持中心。主要負責Websphere產(chǎn)品的支持。對開(kāi)源的項目有很大的興趣??赏ㄟ^(guò) huweih@cn.ibm.com 與她聯(lián)系。 |
||
聯(lián)系客服