Maven2 的新特性

          Posted on 2008-12-12 13:05 李春生 閱讀(183) 評(píng)論(0)  編輯  收藏 所屬分類: maven2
           
          本文主要闡述 Maven2 的新特性,這些新特性可以大大地縮短了開發(fā)管理中的工作量,使得開發(fā)人員將精力集中在實(shí)際的業(yè)務(wù)問題上。

          Maven 出現(xiàn)到現(xiàn)在也有很長時(shí)間了,初識(shí)它的感覺至今仍清晰的印在腦海中。現(xiàn)在想來,當(dāng)時(shí)從 Ant 移情 Maven 的想法其實(shí)很樸素,就是因?yàn)?Maven 可以以網(wǎng)站的形式展現(xiàn)與項(xiàng)目相關(guān)的信息,如開發(fā)人員列表、各種 Report。這種方式為項(xiàng)目的構(gòu)建帶來了極大的方便,尤其是 Report 的。試想對于產(chǎn)生的 Junit-Report、JavaDoc、CheckStyle、PMD 等報(bào)告,如果沒有一個(gè)統(tǒng)一的入口,每次切換目錄是多么令人厭煩的事情!

          Maven 無疑是相當(dāng)成功的,這一點(diǎn)從越來越多的開源項(xiàng)目開始使用 Maven 就可以看出。Maven 取得成功的原因很簡單:在簡化構(gòu)建腳本的同時(shí),功能并沒有縮水,反而有所增強(qiáng);提供匯集項(xiàng)目信息的工具,并以相當(dāng)友好的方式呈現(xiàn);豐富的插件簡化了工作。如此有力的工具出現(xiàn),自然是爭相使用。

          新特性

          如今 Maven2 已經(jīng)推出,Maven 的官方網(wǎng)站稱,Maven2 相對于 Maven1 是一個(gè)相當(dāng)大的轉(zhuǎn)變,甚至不惜犧牲兼容性來達(dá)到這一目的。(為了 Maven1 的用戶著想,Maven1 仍在繼續(xù)他的使命。)如此大的變動(dòng)到底換來了什么樣的結(jié)果?

          1. 更快、更簡單

          比起 Maven1 那不急不慢的運(yùn)行速度,Maven2在速度上有了質(zhì)的飛躍,甚至與Ant相比也毫不遜色(當(dāng)然,下載不算)。除此之外,"簡化工作,使用業(yè)界公認(rèn)的最佳實(shí)踐"也是是 Maven2 的另一大主題,其他的新特性無處不在體現(xiàn) Maven2 為簡化工作而做出的努力。

          2. 更少的配置文件

          Maven1 和 Maven2 主要配置文件的對比:

          • Maven1:project.xml、maven.xml、project.properties和build.properties。
          • Maven2:pom.xml和settings.xml。

          POM是Maven的核心對象模型,在Maven2中POM已由project.xml轉(zhuǎn)移到pom.xml中使用,版本也由3升級(jí)為4。對于項(xiàng)目,一般只需要pom.xml就行了。

          在Maven2中不需要也不提倡使用maven.xml,原因如下:

          • plugin的易用性的增強(qiáng)。
          • 散布于maven.xml中的內(nèi)容難以在不同項(xiàng)目間共享,也不利于維護(hù)。在Maven2中建議使用自定義的plugin來封裝這些內(nèi)容。

          如果仍期望能夠使用類似maven.xml的功能,如<preGoal>,請參考Inserting non-standard build steps using preGoals and postGoals。

          在Maven2中,配置使用settings.xml,它取代了原有的project.properties和build.properties。配置在Maven2中存在兩種級(jí)別:

          • 用戶級(jí),針對操作系統(tǒng)登錄用戶而言。一般在$home/.m2/,對于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語言更換

          在Maven2中,編寫plugin的語言由jelly變更為Java和BeanShell。Java在速度上更有優(yōu)勢,而且開發(fā)人員的熟悉程度更高。對于其他的流行腳本,如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更簡潔。因?yàn)镸aven2已經(jīng)根據(jù)缺省目錄,預(yù)定義了相關(guān)的動(dòng)作,而無需人工的干預(yù)。以resources目錄為例:

          • src/main/resources,負(fù)責(zé)管理項(xiàng)目主體的資源。在使用Maven2執(zhí)行compile之后,這個(gè)目錄中的所有文件及子目錄,會(huì)復(fù)制到target/classes目錄中,為以后的打包提供了方便。
          • src/test/resources,負(fù)責(zé)管理項(xiàng)目測試的資源。在使用Maven2執(zhí)行test-compile之后,這個(gè)目錄中的所有文件及子目錄,會(huì)復(fù)制到target/test-classes目錄中,為后續(xù)的測試做好了準(zhǔn)備。

          這些動(dòng)作在 Maven1 中,是需要在 maven.xml 中使用<preGoal>或<postGoal>來完成的。如今,完全不需要在pom.xml中指定就能夠自動(dòng)完成。在src和test都使用resources,方便構(gòu)建和測試,這種方式本就已是前人的經(jīng)驗(yàn)。通過使用Maven2,使這個(gè)經(jīng)驗(yàn)在開發(fā)團(tuán)隊(duì)中得到普及。

          創(chuàng)建標(biāo)準(zhǔn)目錄模板,可以通過如下命令:


          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中有了明確的生命周期概念,而且都提供與之對應(yīng)的命令,使得項(xiàng)目構(gòu)建更加清晰明了。主要的生命周期階段:

          • validate,驗(yàn)證工程是否正確,所有需要的資源是否可用。
          • compile,編譯項(xiàng)目的源代碼。
          • test-compile,編譯項(xiàng)目測試代碼。
          • test,使用已編譯的測試代碼,測試已編譯的源代碼。
          • package,已發(fā)布的格式,如jar,將已編譯的源代碼打包。
          • integration-test,在集成測試可以運(yùn)行的環(huán)境中處理和發(fā)布包。
          • verify,運(yùn)行任何檢查,驗(yàn)證包是否有效且達(dá)到質(zhì)量標(biāo)準(zhǔn)。
          • install,把包安裝在本地的repository中,可以被其他工程作為依賴來使用
          • deploy,在整合或者發(fā)布環(huán)境下執(zhí)行,將最終版本的包拷貝到遠(yuǎn)程的repository,使得其他的開發(fā)者或者工程可以共享。
          • generate-sources,產(chǎn)生應(yīng)用需要的任何額外的源代碼,如xdoclet。

          如果要執(zhí)行項(xiàng)目編譯,那么直接輸入:mvn compile即可,對于其他的階段可以類推。階段之間是存在依賴關(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)行和測試階段。
          • test,只在測試時(shí)使用,用于編譯和運(yùn)行測試代碼。不會(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. 傳遞依賴,簡化依賴管理

          在Maven1中,需要把依賴所需要的包也一并列出。這對于使用類似如Hibernate的用戶來說所操的心太多了,而且也不方便。在Maven2中實(shí)現(xiàn)了傳遞依賴,如此對于Hibernate所依賴的包,Maven2會(huì)自動(dòng)下載,開發(fā)人員只需關(guān)心Hibernate即可。

          注意:只有得到Maven支持的依賴,通常是plugin形式出現(xiàn),才能獲得這個(gè)特性。而且對于一些老的plugin,可能由于時(shí)間的關(guān)系不支持傳遞依賴。如至少在Maven 2.0.1中,對于Hibernate 2.1.2,仍然需要顯式列出Hibernate 2.1.2所依賴的包。





          回頁首


          使用簡介

          安裝Maven2的步驟非常簡單:首先從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
          • 編譯測試代碼:mvn test-compile
          • 運(yùn)行測試: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下都無法正常工作。以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)注,要不了多長時(shí)間,諸如此類的問題應(yīng)該就會(huì)很快解決。


          只有注冊用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          posts - 5, comments - 10, trackbacks - 0, articles - 23

          Copyright © 李春生

          主站蜘蛛池模板: 济阳县| 长宁区| 天镇县| 白朗县| 芜湖市| 岳普湖县| 丰城市| 金堂县| 永修县| 平陆县| 开化县| 祁东县| 屯留县| 巍山| 永康市| 永兴县| 吉首市| 江永县| 湟源县| 安西县| 彰化市| 萨迦县| 芦山县| 砚山县| 巴南区| 常熟市| 屏东县| 商丘市| 台南县| 招远市| 永定县| 富裕县| 河东区| 富川| 河间市| 泸西县| 塘沽区| 电白县| 北票市| 洪雅县| 新宾|