用Maven做項(xiàng)目管理
在Java世界中我們很多的開發(fā)人員選擇用Ant來(lái)構(gòu)建項(xiàng)目,一個(gè)build.xml能夠完成編譯、測(cè)試、打包、部署等很多任務(wù),但我們也碰到了很多的問題,如jar文件管理混亂,各個(gè)項(xiàng)目結(jié)構(gòu)和build.xml相差很大等等。而Maven的出現(xiàn),給項(xiàng)目提供了更多的支持。
1 簡(jiǎn)介
Maven作為Apache的一個(gè)開源項(xiàng)目,旨在給項(xiàng)目管理提供更多的支持,主頁(yè)地址為
http://maven.apache.org 。它最早的意圖只是為了給apache組織的幾個(gè)項(xiàng)目提供統(tǒng)一的開發(fā)、測(cè)試、打包和部署,能讓開發(fā)者在多個(gè)項(xiàng)目中方便的切換。很多偉大的事業(yè),出發(fā)點(diǎn)都很簡(jiǎn)單,ebay就是很好的例證。而
maven的成功又一次驗(yàn)證了這一點(diǎn),越來(lái)越多的項(xiàng)目開始使用
maven。
基本原理
Maven的基本原理很簡(jiǎn)單,采用遠(yuǎn)程倉(cāng)庫(kù)和本地倉(cāng)庫(kù)以及一個(gè)類似build.xml的pom.xml,將pom.xml中定義的jar文件從遠(yuǎn)程倉(cāng)庫(kù)下載到本地倉(cāng)庫(kù),各個(gè)應(yīng)用使用同一個(gè)本地倉(cāng)庫(kù)的jar,同一個(gè)版本的jar只需下載一次,而且避免每個(gè)應(yīng)用都去拷貝jar。如圖1。同時(shí)它采用了現(xiàn)在流行的插件體系架構(gòu),只保留最小的核心,其余功能都通過(guò)插件的形式提供,所以maven下載很小(1.1M),在執(zhí)行maven任務(wù)時(shí),才會(huì)自動(dòng)下載需要的插件。
這個(gè)基本原理與Pear――PHP擴(kuò)展與應(yīng)用庫(kù)(the PHP Extension and Application Repository)的原理非常相似,都有一個(gè)官方的倉(cāng)庫(kù),都是微內(nèi)核,通過(guò)網(wǎng)絡(luò)將需要的文件下載到本地,通過(guò)官方倉(cāng)庫(kù)將相應(yīng)的類庫(kù)進(jìn)行統(tǒng)一管理。Pear已經(jīng)成為PHP開發(fā)事實(shí)上的標(biāo)準(zhǔn),而Maven在Java世界的地位也逐漸加強(qiáng),成為標(biāo)準(zhǔn)指日可待。
另外由于插件的易開發(fā)性,現(xiàn)在有了非常多的可供選擇的插件,如與eclipse結(jié)合的插件,與test相關(guān)的插件,后面我們結(jié)合maven在項(xiàng)目中的使用進(jìn)行詳細(xì)介紹。
圖1
2 項(xiàng)目管理
Maven官方把maven定義為一個(gè)項(xiàng)目管理工具,我們不妨看看maven能給我們的項(xiàng)目提供哪些好的支持。
2.1 項(xiàng)目標(biāo)準(zhǔn)化
Maven一個(gè)重要特性是定義了項(xiàng)目的標(biāo)準(zhǔn)模板,官方說(shuō)法是最佳實(shí)踐。可以通過(guò)命令:mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app創(chuàng)建一個(gè)單一的maven項(xiàng)目。創(chuàng)建好的項(xiàng)目,具有了特定的項(xiàng)目結(jié)構(gòu)。這個(gè)項(xiàng)目結(jié)構(gòu)是參考業(yè)界的最佳實(shí)踐而成,為后面使用統(tǒng)一的maven命令打下了基礎(chǔ),如測(cè)試mvn test、打包mvn package等,無(wú)需寫一行腳本,就可以方便的實(shí)現(xiàn)眾多功能。Maven還提供其它一些類型模板,可以通過(guò)添加-DarchetypeArtifactId={type}創(chuàng)建,如-DarchetypeArtifactId=maven-archetype-site,生成site類型的項(xiàng)目。
同時(shí)一些好的開源軟件使用了maven,也能作為很好的項(xiàng)目模板,如Equinox(Appfuse的簡(jiǎn)化版),它的pom定義了對(duì)hiberante,spring…的依賴,可以通過(guò)ant new -Dapp.name=NAME快速生成項(xiàng)目原型,然后對(duì)pom文件進(jìn)行裁減,以符合自身項(xiàng)目的需要。
有了這個(gè)標(biāo)準(zhǔn),項(xiàng)目間能方便的進(jìn)行交流,你也很容易了解其它使用maven項(xiàng)目的結(jié)構(gòu)。對(duì)于企業(yè)來(lái)說(shuō),引入maven就自然引入了規(guī)范,這可比費(fèi)時(shí)費(fèi)力的寫文檔,定規(guī)范有效的多了。
2.2 文檔和報(bào)告
使用mvn site可以快速生成項(xiàng)目站點(diǎn),apache很多開源項(xiàng)目站點(diǎn)都采用maven生成,會(huì)出現(xiàn)built by maven字樣的圖標(biāo)。
2.3 類庫(kù)管理
Maven一個(gè)很重要的特色就是類庫(kù)管理。通過(guò)在pom.xml中定義jar包版本和依賴,能夠方便的管理jar文件。以下是一個(gè)簡(jiǎn)單的jar定義片斷:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.1</version>
<type>jar</type>
<scope>runtime</scope>
</dependency>
|
這個(gè)片斷告訴我們,依賴的jar包groupId為org.hibernate,artifactId為hibernate,版本為3.1,scope為runtime。在實(shí)際項(xiàng)目中,會(huì)將M2_REPO(maven本地倉(cāng)庫(kù)地址)/ org/hibernate / hibernate /3.1/ hibernate -3.1.jar放入classpath。
同時(shí)maven會(huì)通過(guò)pom.xml管理jar包間的依賴。比如上面的hibernate-3.1.jar同級(jí)目錄肯定會(huì)有一個(gè)hibernate -3.1.pom,在這個(gè)pom文件中指定了這個(gè)jar對(duì)其它一些jar的依賴。而這個(gè)pom文件是遠(yuǎn)程倉(cāng)庫(kù)提供,無(wú)需進(jìn)行修改,執(zhí)行maven相關(guān)命令就會(huì)自動(dòng)根據(jù)相關(guān)依賴去下載jar包。這樣只需定義對(duì)hibernate的依賴而無(wú)需關(guān)心相關(guān)jar,在構(gòu)建項(xiàng)目上方便了很多。
因?yàn)閜om文件對(duì)jar的管理,也產(chǎn)生了一個(gè)很吸引人的特性:項(xiàng)目文件很小。以往一個(gè)web項(xiàng)目中,jar文件都要放入WEB-INF/lib下,并放入cvs(svn)中,很容易就達(dá)到幾十M。而通過(guò)maven,只需一個(gè)pom.xml,在執(zhí)行mvn eclipse:eclipse時(shí)再去遠(yuǎn)程倉(cāng)庫(kù)下載,項(xiàng)目文件一般只需幾百K。
2.4 發(fā)布管理
使用maven可以方便的進(jìn)行項(xiàng)目發(fā)表管理。在項(xiàng)目開發(fā)到一定階段,可以使用mvn package打包,它會(huì)自動(dòng)先運(yùn)行mvn test,跑所有的testcase,只有全部通過(guò)才能正確打包。生成的war包(如果項(xiàng)目的packaging為war)在target目錄下。這個(gè)war包與使用ant腳本生成一樣,但無(wú)需一行腳本,這也是maven對(duì)比ant的優(yōu)勢(shì)之一。使用mvn install將編譯和打包好的文件發(fā)布到distributionManager指定的遠(yuǎn)程repository。使用mvn deploy可以自動(dòng)管理項(xiàng)目版本。
3 使用maven
Maven使用簡(jiǎn)單,插件豐富且經(jīng)過(guò)大量項(xiàng)目考驗(yàn),在項(xiàng)目中引入的風(fēng)險(xiǎn)很小。筆者在項(xiàng)目中使用maven,新進(jìn)員工在半小時(shí)內(nèi)就能成功使用maven構(gòu)建項(xiàng)目,并很快掌握幾個(gè)常用的命令。Maven也不需要什么特殊的設(shè)施。如果項(xiàng)目全部使用開源軟件,并且不需要maven管理項(xiàng)目版本,只需要一個(gè)SCM環(huán)境(CVS或SVN),共享開發(fā)源碼就可以。把pom.xml中的repository設(shè)為官方地址就行,配置如下:
<repository>
<id>central</id>
<url>http://www.ibiblio.org/maven2</url>
</repository>
|
這個(gè)官方remote repository上有非常多的開源軟件,應(yīng)該能滿足大部分項(xiàng)目的需要。如果有項(xiàng)目需要而它上面暫時(shí)還沒有的軟件,或者希望使用公司內(nèi)部的軟件,那么就需要自己配置一個(gè)repository了。
3.1 自建私服
傳奇私服大家應(yīng)該都聽過(guò),一個(gè)網(wǎng)吧自己搞個(gè)私服,一伙人免費(fèi)在上面砍殺。官方因此少賺了很多錢,因此總想打擊。而maven官方卻對(duì)自建私服很是支持,我們總算可以正正當(dāng)當(dāng)搞把私服了(Springside的老大江南白衣就是創(chuàng)建私服的好手)。我們就來(lái)介紹下自建私服的最快方法。
首先需要一個(gè)http server,找臺(tái)服務(wù)器裝上apache就行。放一個(gè)空的
maven目錄到htdocs下,假設(shè)服務(wù)器ip為192.168.0.1,確認(rèn)能用
http://192.168.0.1/maven訪問到。然后在自己機(jī)器上裝好maven2,初始化好項(xiàng)目,在pom.xml放入需要的jar定義,運(yùn)行如mvn eclipse:eclipse就自動(dòng)從官方下載jar到本地,如果不做配置,默認(rèn)本地repository為${user.home}/.m2/。對(duì)于windows xp來(lái)說(shuō)一般在C:\Documents and Settings\%username%\.m2下,其中%username%為操作系統(tǒng)登錄用戶名。這時(shí)你可以看到${user.home}/.m2/下多了個(gè)repository目錄,里面有很多的項(xiàng)目相關(guān)jar,目錄按groupId/ artifactId/version排好。把repository目錄整個(gè)拷貝到apache服務(wù)器的
maven目錄下,如果需要官方缺少的jar或公司內(nèi)部jar,仿照這個(gè)目錄結(jié)構(gòu),做好jar放到
maven目錄下。自建私服成功!
要使用私服,只需修改pom.xml,在repository配置后加上:
<repository>
<id>companyName</id>
<url>http:// ${ip}/maven</url>
</repository>
|
這樣需要下載jar時(shí),會(huì)先到本地repository查看,沒有下載過(guò)再到官方搜索,沒有找到再到后面的repository查找。
3.2 安裝配置
Maven的安裝很簡(jiǎn)單:
1. 從apache網(wǎng)站上下載maven安裝包,實(shí)際上就是個(gè)壓縮文件。將其解壓到你想要存放maven的目錄中。在這里假設(shè)你將maven解壓到C:\Program Files\Apache Software Foundation\maven-2.0.4中。
2. 將C:\Program Files\Apache Software Foundation\maven-2.0.4\bin設(shè)到你的系統(tǒng)環(huán)境變量%PATH%中。
3. 同時(shí)確保你已經(jīng)將你的JDK安裝目錄設(shè)為java_home系統(tǒng)變量。
4. 打開個(gè)命令行窗口,運(yùn)行mvn –version驗(yàn)證是否安裝成功。
5. 如果使用eclipse,在運(yùn)行mvn eclipse:eclipse生成eclipse項(xiàng)目文件后,需加入M2_REPO到Classpath Variables中,指向本地repository,例如:C:/Documents and Settings/Owner/.m2/repository。
3.3 基本使用流程
在項(xiàng)目進(jìn)程中,不必做什么配置,在pom.xml同級(jí)目錄,cmd使用簡(jiǎn)單的maven命令,就可以完成初始化->開發(fā)->測(cè)試->發(fā)布的全過(guò)程。Maven的基本使用流程如下圖:

其中在初次使用命令mvn eclipse:eclipse時(shí)會(huì)下載很多的插件和jar,可能需要較長(zhǎng)的時(shí)間,建議泡杯咖啡,和同事吹吹牛。如果失敗,可能是網(wǎng)絡(luò)問題,可以重新運(yùn)行mvn eclipse:eclipse,已下載好的插件和jar不會(huì)再下。運(yùn)行mvn test和mvn package等命令,產(chǎn)出物都會(huì)放在target目錄下。如果在使用過(guò)程中有什么問題,也可以和我聯(lián)系,mail:pesome@gmail.com,我們一起來(lái)嘗試解決。
總結(jié):
Maven作為新的項(xiàng)目管理工具,簡(jiǎn)單易用,能對(duì)項(xiàng)目的各個(gè)階段提供大力支持,同時(shí)由于它易擴(kuò)展的插件體系架構(gòu),出現(xiàn)了越來(lái)越多的插件,也使得其功能更加強(qiáng)大。短短一篇文章,實(shí)在很難把其特點(diǎn)一一盡述,maven還有很多好用的功能和插件等待我們?nèi)ナ褂煤烷_發(fā)。而學(xué)習(xí)新技術(shù)的最好方式就是實(shí)踐,大家如果有興趣,盡快下載一個(gè)最新版,開始你的maven之旅吧!
參考文檔:
1. http://maven.apache.org 官方網(wǎng)站文檔
Maven 出現(xiàn)到現(xiàn)在也有很長(zhǎng)時(shí)間了,初識(shí)它的感覺至今仍清晰的印在腦海中。現(xiàn)在想來(lái),當(dāng)時(shí)從 Ant 移情 Maven 的想法其實(shí)很樸素,就是因?yàn)?Maven 可以以網(wǎng)站的形式展現(xiàn)與項(xiàng)目相關(guān)的信息,如開發(fā)人員列表、各種 Report。這種方式為項(xiàng)目的構(gòu)建帶來(lái)了極大的方便,尤其是 Report 的。試想對(duì)于產(chǎn)生的 Junit-Report、JavaDoc、CheckStyle、PMD 等報(bào)告,如果沒有一個(gè)統(tǒng)一的入口,每次切換目錄是多么令人厭煩的事情!
Maven 無(wú)疑是相當(dāng)成功的,這一點(diǎn)從越來(lái)越多的開源項(xiàng)目開始使用 Maven 就可以看出。Maven 取得成功的原因很簡(jiǎn)單:在簡(jiǎn)化構(gòu)建腳本的同時(shí),功能并沒有縮水,反而有所增強(qiáng);提供匯集項(xiàng)目信息的工具,并以相當(dāng)友好的方式呈現(xiàn);豐富的插件簡(jiǎn)化了工作。如此有力的工具出現(xiàn),自然是爭(zhēng)相使用。
新特性
如今 Maven2 已經(jīng)推出,Maven 的官方網(wǎng)站稱,Maven2 相對(duì)于 Maven1 是一個(gè)相當(dāng)大的轉(zhuǎn)變,甚至不惜犧牲兼容性來(lái)達(dá)到這一目的。(為了 Maven1 的用戶著想,Maven1 仍在繼續(xù)他的使命。)如此大的變動(dòng)到底換來(lái)了什么樣的結(jié)果?
1. 更快、更簡(jiǎn)單
比起 Maven1 那不急不慢的運(yùn)行速度,Maven2在速度上有了質(zhì)的飛躍,甚至與Ant相比也毫不遜色(當(dāng)然,下載不算)。除此之外,"簡(jiǎn)化工作,使用業(yè)界公認(rèn)的最佳實(shí)踐"也是是 Maven2 的另一大主題,其他的新特性無(wú)處不在體現(xiàn) Maven2 為簡(jiǎn)化工作而做出的努力。
2. 更少的配置文件
Maven1 和 Maven2 主要配置文件的對(duì)比:
- Maven1:project.xml、maven.xml、project.properties和build.properties。
- Maven2:pom.xml和settings.xml。
POM是Maven的核心對(duì)象模型,在Maven2中POM已由project.xml轉(zhuǎn)移到pom.xml中使用,版本也由3升級(jí)為4。對(duì)于項(xiàng)目,一般只需要pom.xml就行了。
在Maven2中不需要也不提倡使用maven.xml,原因如下:
- plugin的易用性的增強(qiáng)。
- 散布于maven.xml中的內(nèi)容難以在不同項(xiàng)目間共享,也不利于維護(hù)。在Maven2中建議使用自定義的plugin來(lái)封裝這些內(nèi)容。
如果仍期望能夠使用類似maven.xml的功能,如<preGoal>,請(qǐng)參考Inserting non-standard build steps using preGoals and postGoals。
在Maven2中,配置使用settings.xml,它取代了原有的project.properties和build.properties。配置在Maven2中存在兩種級(jí)別:
- 用戶級(jí),針對(duì)操作系統(tǒng)登錄用戶而言。一般在$home/.m2/,對(duì)于windows用戶,就是目錄:C:\Documents and Settings\用戶名\.m2\settings.xml。
- 全局級(jí):一般在%M2_HOME%/conf/settings.xml,M2_HOME是Maven2的根目錄環(huán)境變量名。
在settings.xml中可以配置,如本地Repository、proxy等等,關(guān)于settings.xml的結(jié)構(gòu)可以從Maven的官方網(wǎng)站上獲取。
3. Plugin語(yǔ)言更換
在Maven2中,編寫plugin的語(yǔ)言由jelly變更為Java和BeanShell。Java在速度上更有優(yōu)勢(shì),而且開發(fā)人員的熟悉程度更高。對(duì)于其他的流行腳本,如groovy,Maven的官方網(wǎng)站的意見是,等待其更成熟時(shí)再考慮
。
4. 提供預(yù)定義的目錄模板
好的目錄結(jié)構(gòu)可以使開發(fā)人員更容易理解項(xiàng)目,為以后的維護(hù)工作也打下良好的基礎(chǔ)。Maven2根據(jù)業(yè)界公認(rèn)的最佳目錄結(jié)構(gòu),為開發(fā)者提供了缺省的標(biāo)準(zhǔn)目錄模板。Maven2的標(biāo)準(zhǔn)目錄結(jié)構(gòu)如下:
使用目錄模板,可以使pom.xml更簡(jiǎn)潔。因?yàn)镸aven2已經(jīng)根據(jù)缺省目錄,預(yù)定義了相關(guān)的動(dòng)作,而無(wú)需人工的干預(yù)。以resources目錄為例:
- src/main/resources,負(fù)責(zé)管理項(xiàng)目主體的資源。在使用Maven2執(zhí)行compile之后,這個(gè)目錄中的所有文件及子目錄,會(huì)復(fù)制到target/classes目錄中,為以后的打包提供了方便。
- src/test/resources,負(fù)責(zé)管理項(xiàng)目測(cè)試的資源。在使用Maven2執(zhí)行test-compile之后,這個(gè)目錄中的所有文件及子目錄,會(huì)復(fù)制到target/test-classes目錄中,為后續(xù)的測(cè)試做好了準(zhǔn)備。
這些動(dòng)作在 Maven1 中,是需要在 maven.xml 中使用<preGoal>或<postGoal>來(lái)完成的。如今,完全不需要在pom.xml中指定就能夠自動(dòng)完成。在src和test都使用resources,方便構(gòu)建和測(cè)試,這種方式本就已是前人的經(jīng)驗(yàn)。通過(guò)使用Maven2,使這個(gè)經(jīng)驗(yàn)在開發(fā)團(tuán)隊(duì)中得到普及。
創(chuàng)建標(biāo)準(zhǔn)目錄模板,可以通過(guò)如下命令:
mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=codelineCommons
|
groupId和artifactId的含義與Maven1中的含義一樣,參數(shù)artifactId的值會(huì)作為項(xiàng)目根目錄的名字。除了建立相應(yīng)的目錄之外,Maven2還會(huì)創(chuàng)建缺省的pom.xml。
Maven2也考慮到:不同類型的項(xiàng)目需要擁有不同的目錄結(jié)構(gòu)。如創(chuàng)建web項(xiàng)目,可以使用命令:
mvn archetype:create -DgroupId=com.mycompany.app-DartifactId=my-webapp-DarchetypeArtifactId=maven-archetype-webapp
|
5. 生命周期的引入
在Maven2中有了明確的生命周期概念,而且都提供與之對(duì)應(yīng)的命令,使得項(xiàng)目構(gòu)建更加清晰明了。主要的生命周期階段:
- validate,驗(yàn)證工程是否正確,所有需要的資源是否可用。
- compile,編譯項(xiàng)目的源代碼。
- test-compile,編譯項(xiàng)目測(cè)試代碼。
- test,使用已編譯的測(cè)試代碼,測(cè)試已編譯的源代碼。
- package,已發(fā)布的格式,如jar,將已編譯的源代碼打包。
- integration-test,在集成測(cè)試可以運(yùn)行的環(huán)境中處理和發(fā)布包。
- verify,運(yùn)行任何檢查,驗(yàn)證包是否有效且達(dá)到質(zhì)量標(biāo)準(zhǔn)。
- install,把包安裝在本地的repository中,可以被其他工程作為依賴來(lái)使用
- deploy,在整合或者發(fā)布環(huán)境下執(zhí)行,將最終版本的包拷貝到遠(yuǎn)程的repository,使得其他的開發(fā)者或者工程可以共享。
- generate-sources,產(chǎn)生應(yīng)用需要的任何額外的源代碼,如xdoclet。
如果要執(zhí)行項(xiàng)目編譯,那么直接輸入:mvn compile即可,對(duì)于其他的階段可以類推。階段之間是存在依賴關(guān)系(dependency)的,如test依賴test-compile。在執(zhí)行mvn test時(shí),會(huì)先運(yùn)行mvn test-compile,然后才是mvn test。
6. 新增Dependency Scope
在POM 4中,<dependency>中還引入了<scope>,它主要管理依賴的部署。目前<scope>可以使用5個(gè)值:
- compile,缺省值,適用于所有階段,會(huì)隨著項(xiàng)目一起發(fā)布。
- provided,類似compile,期望JDK、容器或使用者會(huì)提供這個(gè)依賴。如servlet.jar。
- runtime,只在運(yùn)行時(shí)使用,如JDBC驅(qū)動(dòng),適用運(yùn)行和測(cè)試階段。
- test,只在測(cè)試時(shí)使用,用于編譯和運(yùn)行測(cè)試代碼。不會(huì)隨項(xiàng)目發(fā)布。
- system,類似provided,需要顯式提供包含依賴的jar,Maven不會(huì)在Repository中查找它。
<scope>的使用舉例:
<dependency><groupId>hibernate</groupId><artifactId>hibernate</artifactId><version>3.0.3</version><scope>test</scope></dependency>
|
7. 傳遞依賴,簡(jiǎn)化依賴管理
在Maven1中,需要把依賴所需要的包也一并列出。這對(duì)于使用類似如Hibernate的用戶來(lái)說(shuō)所操的心太多了,而且也不方便。在Maven2中實(shí)現(xiàn)了傳遞依賴,如此對(duì)于Hibernate所依賴的包,Maven2會(huì)自動(dòng)下載,開發(fā)人員只需關(guān)心Hibernate即可。
注意:只有得到Maven支持的依賴,通常是plugin形式出現(xiàn),才能獲得這個(gè)特性。而且對(duì)于一些老的plugin,可能由于時(shí)間的關(guān)系不支持傳遞依賴。如至少在Maven 2.0.1中,對(duì)于Hibernate 2.1.2,仍然需要顯式列出Hibernate 2.1.2所依賴的包。
使用簡(jiǎn)介
安裝Maven2的步驟非常簡(jiǎn)單:首先從Maven官方網(wǎng)站下載相應(yīng)的軟件包,目前是Maven 2.0.1;然后解壓,并設(shè)置環(huán)境變量M2_HOME= Maven2的解壓安裝目錄;最后將%M2_HOME%/bin添加到path中,方便Maven在任何目錄下運(yùn)行。
Maven2的運(yùn)行命令是mvn,使用mvn -h可以獲得相關(guān)的幫助信息。常用情形:
- 創(chuàng)建Maven項(xiàng)目:mvn archetype:create
- 編譯源代碼:mvn compile
- 編譯測(cè)試代碼:mvn test-compile
- 運(yùn)行測(cè)試:mvn test
- 產(chǎn)生site:mvn site
- 打包:mvn package
- 在本地Repository中安裝jar:mvn install
- 清除產(chǎn)生的項(xiàng)目:mvn clean
或許是由于剛剛推出的緣故,Maven2目前還是有一些不盡如人意的地方。尤其是Report部分的plugin,有的是因?yàn)槟壳斑€沒有,如junit-report。有的則是一些莫名其妙的問題,如checktyle和pmd,在本地locale下都無(wú)法正常工作。以pmd舉例,在產(chǎn)生PMD報(bào)告時(shí)會(huì)拋出如下異常:
java.util.MissingResourceException: Can't find bundle for base name pmd-report,locale zh_CN at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:839) at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:808) at java.util.ResourceBundle.getBundle(ResourceBundle.java:702)……
|
幸運(yùn)的是,Maven2一出現(xiàn)就備受關(guān)注,要不了多長(zhǎng)時(shí)間,諸如此類的問題應(yīng)該就會(huì)很快解決。
結(jié)論
Maven2在Maven1的優(yōu)勢(shì)基礎(chǔ)之上,又向前邁進(jìn)了一大步。它提供的這些新特性大大地縮短了開發(fā)管理中的工作量,使得開發(fā)人員將精力集中在實(shí)際的業(yè)務(wù)問題上。而且這些新特性對(duì)于簡(jiǎn)化使用,普及最佳實(shí)踐,也起到了積極的作用。