本文主要闡述 Maven2 的新特性,這些新特性可以大大地縮短了開發(fā)管理中的工作量,使得開發(fā)人員將精力集中在實際的業(yè)務問題上。
Maven 出現(xiàn)到現(xiàn)在也有很長時間了,初識它的感覺至今仍清晰的印在腦海中。現(xiàn)在想來,當時從 Ant 移情 Maven 的想法其實很樸素,就是因為 Maven 可以以網(wǎng)站的形式展現(xiàn)與項目相關的信息,如開發(fā)人員列表、各種 Report。這種方式為項目的構建帶來了極大的方便,尤其是 Report 的。試想對于產(chǎn)生的 Junit-Report、JavaDoc、CheckStyle、PMD 等報告,如果沒有一個統(tǒng)一的入口,每次切換目錄是多么令人厭煩的事情!
Maven 無疑是相當成功的,這一點從越來越多的開源項目開始使用 Maven 就可以看出。Maven 取得成功的原因很簡單:在簡化構建腳本的同時,功能并沒有縮水,反而有所增強;提供匯集項目信息的工具,并以相當友好的方式呈現(xiàn);豐富的插件簡化了工作。如此有力的工具出現(xiàn),自然是爭相使用。
新特性
如今 Maven2 已經(jīng)推出,Maven 的官方網(wǎng)站稱,Maven2 相對于 Maven1 是一個相當大的轉變,甚至不惜犧牲兼容性來達到這一目的。(為了 Maven1 的用戶著想,Maven1 仍在繼續(xù)他的使命。)如此大的變動到底換來了什么樣的結果?
1. 更快、更簡單
比起 Maven1 那不急不慢的運行速度,Maven2在速度上有了質(zhì)的飛躍,甚至與Ant相比也毫不遜色(當然,下載不算)。除此之外,"簡化工作,使用業(yè)界公認的最佳實踐"也是是 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轉移到pom.xml中使用,版本也由3升級為4。對于項目,一般只需要pom.xml就行了。
在Maven2中不需要也不提倡使用maven.xml,原因如下:
plugin的易用性的增強。
散布于maven.xml中的內(nèi)容難以在不同項目間共享,也不利于維護。在Maven2中建議使用自定義的plugin來封裝這些內(nèi)容。
如果仍期望能夠使用類似maven.xml的功能,如<preGoal>,請參考Inserting non-standard build steps using preGoals and postGoals。
在Maven2中,配置使用settings.xml,它取代了原有的project.properties和build.properties。配置在Maven2中存在兩種級別:
用戶級,針對操作系統(tǒng)登錄用戶而言。一般在$home/.m2/,對于windows用戶,就是目錄:C:\Documents and Settings\用戶名\.m2\settings.xml。
全局級:一般在%M2_HOME%/conf/settings.xml,M2_HOME是Maven2的根目錄環(huán)境變量名。
在settings.xml中可以配置,如本地Repository、proxy等等,關于settings.xml的結構可以從Maven的官方網(wǎng)站上獲取。
3. Plugin語言更換
在Maven2中,編寫plugin的語言由jelly變更為Java和BeanShell。Java在速度上更有優(yōu)勢,而且開發(fā)人員的熟悉程度更高。對于其他的流行腳本,如groovy,Maven的官方網(wǎng)站的意見是,等待其更成熟時再考慮
。
4. 提供預定義的目錄模板
好的目錄結構可以使開發(fā)人員更容易理解項目,為以后的維護工作也打下良好的基礎。Maven2根據(jù)業(yè)界公認的最佳目錄結構,為開發(fā)者提供了缺省的標準目錄模板。Maven2的標準目錄結構如下:
使用目錄模板,可以使pom.xml更簡潔。因為Maven2已經(jīng)根據(jù)缺省目錄,預定義了相關的動作,而無需人工的干預。以resources目錄為例:
src/main/resources,負責管理項目主體的資源。在使用Maven2執(zhí)行compile之后,這個目錄中的所有文件及子目錄,會復制到target/classes目錄中,為以后的打包提供了方便。
src/test/resources,負責管理項目測試的資源。在使用Maven2執(zhí)行test-compile之后,這個目錄中的所有文件及子目錄,會復制到target/test-classes目錄中,為后續(xù)的測試做好了準備。
這些動作在 Maven1 中,是需要在 maven.xml 中使用<preGoal>或<postGoal>來完成的。如今,完全不需要在pom.xml中指定就能夠自動完成。在src和 test都使用resources,方便構建和測試,這種方式本就已是前人的經(jīng)驗。通過使用Maven2,使這個經(jīng)驗在開發(fā)團隊中得到普及。
創(chuàng)建標準目錄模板,可以通過如下命令:
groupId和artifactId的含義與Maven1中的含義一樣,參數(shù)artifactId的值會作為項目根目錄的名字。除了建立相應的目錄之外,Maven2還會創(chuàng)建缺省的pom.xml。
Maven2也考慮到:不同類型的項目需要擁有不同的目錄結構。如創(chuàng)建web項目,可以使用命令:
5. 生命周期的引入
在Maven2中有了明確的生命周期概念,而且都提供與之對應的命令,使得項目構建更加清晰明了。主要的生命周期階段:
validate,驗證工程是否正確,所有需要的資源是否可用。
compile,編譯項目的源代碼。
test-compile,編譯項目測試代碼。
test,使用已編譯的測試代碼,測試已編譯的源代碼。
package,已發(fā)布的格式,如jar,將已編譯的源代碼打包。
integration-test,在集成測試可以運行的環(huán)境中處理和發(fā)布包。
verify,運行任何檢查,驗證包是否有效且達到質(zhì)量標準。
install,把包安裝在本地的repository中,可以被其他工程作為依賴來使用
deploy,在整合或者發(fā)布環(huán)境下執(zhí)行,將最終版本的包拷貝到遠程的repository,使得其他的開發(fā)者或者工程可以共享。
generate-sources,產(chǎn)生應用需要的任何額外的源代碼,如xdoclet。
如果要執(zhí)行項目編譯,那么直接輸入:mvn compile即可,對于其他的階段可以類推。階段之間是存在依賴關系(dependency)的,如test依賴test-compile。在執(zhí)行 mvn test時,會先運行mvn test-compile,然后才是mvn test。
6. 新增Dependency Scope
在POM 4中,<dependency>中還引入了<scope>,它主要管理依賴的部署。目前<scope>可以使用5個值:
compile,缺省值,適用于所有階段,會隨著項目一起發(fā)布。
provided,類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet.jar。
runtime,只在運行時使用,如JDBC驅(qū)動,適用運行和測試階段。
test,只在測試時使用,用于編譯和運行測試代碼。不會隨項目發(fā)布。
system,類似provided,需要顯式提供包含依賴的jar,Maven不會在Repository中查找它。
<scope>的使用舉例:
7. 傳遞依賴,簡化依賴管理
在Maven1中,需要把依賴所需要的包也一并列出。這對于使用類似如Hibernate的用戶來說所操的心太多了,而且也不方便。在Maven2中實現(xiàn)了傳遞依賴,如此對于Hibernate所依賴的包,Maven2會自動下載,開發(fā)人員只需關心Hibernate即可。
注意:只有得到Maven支持的依賴,通常是plugin形式出現(xiàn),才能獲得這個特性。而且對于一些老的plugin,可能由于時間的關系不支持傳遞依賴。如至少在Maven 2.0.1中,對于Hibernate 2.1.2,仍然需要顯式列出Hibernate 2.1.2所依賴的包。
[/img]
Maven 出現(xiàn)到現(xiàn)在也有很長時間了,初識它的感覺至今仍清晰的印在腦海中。現(xiàn)在想來,當時從 Ant 移情 Maven 的想法其實很樸素,就是因為 Maven 可以以網(wǎng)站的形式展現(xiàn)與項目相關的信息,如開發(fā)人員列表、各種 Report。這種方式為項目的構建帶來了極大的方便,尤其是 Report 的。試想對于產(chǎn)生的 Junit-Report、JavaDoc、CheckStyle、PMD 等報告,如果沒有一個統(tǒng)一的入口,每次切換目錄是多么令人厭煩的事情!
Maven 無疑是相當成功的,這一點從越來越多的開源項目開始使用 Maven 就可以看出。Maven 取得成功的原因很簡單:在簡化構建腳本的同時,功能并沒有縮水,反而有所增強;提供匯集項目信息的工具,并以相當友好的方式呈現(xiàn);豐富的插件簡化了工作。如此有力的工具出現(xiàn),自然是爭相使用。
新特性
如今 Maven2 已經(jīng)推出,Maven 的官方網(wǎng)站稱,Maven2 相對于 Maven1 是一個相當大的轉變,甚至不惜犧牲兼容性來達到這一目的。(為了 Maven1 的用戶著想,Maven1 仍在繼續(xù)他的使命。)如此大的變動到底換來了什么樣的結果?
1. 更快、更簡單
比起 Maven1 那不急不慢的運行速度,Maven2在速度上有了質(zhì)的飛躍,甚至與Ant相比也毫不遜色(當然,下載不算)。除此之外,"簡化工作,使用業(yè)界公認的最佳實踐"也是是 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轉移到pom.xml中使用,版本也由3升級為4。對于項目,一般只需要pom.xml就行了。
在Maven2中不需要也不提倡使用maven.xml,原因如下:
plugin的易用性的增強。
散布于maven.xml中的內(nèi)容難以在不同項目間共享,也不利于維護。在Maven2中建議使用自定義的plugin來封裝這些內(nèi)容。
如果仍期望能夠使用類似maven.xml的功能,如<preGoal>,請參考Inserting non-standard build steps using preGoals and postGoals。
在Maven2中,配置使用settings.xml,它取代了原有的project.properties和build.properties。配置在Maven2中存在兩種級別:
用戶級,針對操作系統(tǒng)登錄用戶而言。一般在$home/.m2/,對于windows用戶,就是目錄:C:\Documents and Settings\用戶名\.m2\settings.xml。
全局級:一般在%M2_HOME%/conf/settings.xml,M2_HOME是Maven2的根目錄環(huán)境變量名。
在settings.xml中可以配置,如本地Repository、proxy等等,關于settings.xml的結構可以從Maven的官方網(wǎng)站上獲取。
3. Plugin語言更換
在Maven2中,編寫plugin的語言由jelly變更為Java和BeanShell。Java在速度上更有優(yōu)勢,而且開發(fā)人員的熟悉程度更高。對于其他的流行腳本,如groovy,Maven的官方網(wǎng)站的意見是,等待其更成熟時再考慮
。
4. 提供預定義的目錄模板
好的目錄結構可以使開發(fā)人員更容易理解項目,為以后的維護工作也打下良好的基礎。Maven2根據(jù)業(yè)界公認的最佳目錄結構,為開發(fā)者提供了缺省的標準目錄模板。Maven2的標準目錄結構如下:
1 |
項目根/ pom.xml src/ main/ 項目主體目錄 java 源代碼目錄 resources 所需 資源目錄 fileters 資源過濾文件目錄 assembly config 配置文件目錄 test/ main/ java resources fileters site 與site相關的資源文件 target/ 輸出目錄 classes 項目主題輸出目錄 test-classes 測試輸出目錄 site 項木site輸出目錄 |
使用目錄模板,可以使pom.xml更簡潔。因為Maven2已經(jīng)根據(jù)缺省目錄,預定義了相關的動作,而無需人工的干預。以resources目錄為例:
src/main/resources,負責管理項目主體的資源。在使用Maven2執(zhí)行compile之后,這個目錄中的所有文件及子目錄,會復制到target/classes目錄中,為以后的打包提供了方便。
src/test/resources,負責管理項目測試的資源。在使用Maven2執(zhí)行test-compile之后,這個目錄中的所有文件及子目錄,會復制到target/test-classes目錄中,為后續(xù)的測試做好了準備。
這些動作在 Maven1 中,是需要在 maven.xml 中使用<preGoal>或<postGoal>來完成的。如今,完全不需要在pom.xml中指定就能夠自動完成。在src和 test都使用resources,方便構建和測試,這種方式本就已是前人的經(jīng)驗。通過使用Maven2,使這個經(jīng)驗在開發(fā)團隊中得到普及。
創(chuàng)建標準目錄模板,可以通過如下命令:
1 |
mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=codelineCommons |
groupId和artifactId的含義與Maven1中的含義一樣,參數(shù)artifactId的值會作為項目根目錄的名字。除了建立相應的目錄之外,Maven2還會創(chuàng)建缺省的pom.xml。
Maven2也考慮到:不同類型的項目需要擁有不同的目錄結構。如創(chuàng)建web項目,可以使用命令:
1 |
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp |
5. 生命周期的引入
在Maven2中有了明確的生命周期概念,而且都提供與之對應的命令,使得項目構建更加清晰明了。主要的生命周期階段:
validate,驗證工程是否正確,所有需要的資源是否可用。
compile,編譯項目的源代碼。
test-compile,編譯項目測試代碼。
test,使用已編譯的測試代碼,測試已編譯的源代碼。
package,已發(fā)布的格式,如jar,將已編譯的源代碼打包。
integration-test,在集成測試可以運行的環(huán)境中處理和發(fā)布包。
verify,運行任何檢查,驗證包是否有效且達到質(zhì)量標準。
install,把包安裝在本地的repository中,可以被其他工程作為依賴來使用
deploy,在整合或者發(fā)布環(huán)境下執(zhí)行,將最終版本的包拷貝到遠程的repository,使得其他的開發(fā)者或者工程可以共享。
generate-sources,產(chǎn)生應用需要的任何額外的源代碼,如xdoclet。
如果要執(zhí)行項目編譯,那么直接輸入:mvn compile即可,對于其他的階段可以類推。階段之間是存在依賴關系(dependency)的,如test依賴test-compile。在執(zhí)行 mvn test時,會先運行mvn test-compile,然后才是mvn test。
6. 新增Dependency Scope
在POM 4中,<dependency>中還引入了<scope>,它主要管理依賴的部署。目前<scope>可以使用5個值:
compile,缺省值,適用于所有階段,會隨著項目一起發(fā)布。
provided,類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet.jar。
runtime,只在運行時使用,如JDBC驅(qū)動,適用運行和測試階段。
test,只在測試時使用,用于編譯和運行測試代碼。不會隨項目發(fā)布。
system,類似provided,需要顯式提供包含依賴的jar,Maven不會在Repository中查找它。
<scope>的使用舉例:
1 |
<dependency> <groupId>hibernate</groupId> <artifactId>hibernate</artifactId> <version>3.0.3</version> <scope>test</scope> </dependency> |
7. 傳遞依賴,簡化依賴管理
在Maven1中,需要把依賴所需要的包也一并列出。這對于使用類似如Hibernate的用戶來說所操的心太多了,而且也不方便。在Maven2中實現(xiàn)了傳遞依賴,如此對于Hibernate所依賴的包,Maven2會自動下載,開發(fā)人員只需關心Hibernate即可。
注意:只有得到Maven支持的依賴,通常是plugin形式出現(xiàn),才能獲得這個特性。而且對于一些老的plugin,可能由于時間的關系不支持傳遞依賴。如至少在Maven 2.0.1中,對于Hibernate 2.1.2,仍然需要顯式列出Hibernate 2.1.2所依賴的包。

平均得分
(0 次評分)
