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