1. 什么是maven
從字面解釋maven是知識淵博、經(jīng)驗豐富的專家或怪才的意思。深入研究和使用maven,確實讓人感到它確實沉淀了Java項目構(gòu)建領(lǐng)域中的豐富知識和經(jīng)驗,并以一種高度可復用的形式出現(xiàn)在你的面前。maven的開發(fā)者在他們開發(fā)網(wǎng)站上指出,maven的目標是要使得項目的構(gòu)建更加容易,它把編譯、打包、測試、發(fā)布等開發(fā)過程中的不同環(huán)節(jié)有機的串聯(lián)了起來,并產(chǎn)生一致的、高質(zhì)量的項目信息,使得項目成員能夠及時地得到反饋。maven有效地支持了測試優(yōu)先、持續(xù)集成,體現(xiàn)了鼓勵溝通,及時反饋的軟件開發(fā)理念。如果說Ant的復用是建立在"拷貝--粘貼"的基礎(chǔ)上的,那么Maven通過插件的機制實現(xiàn)了項目構(gòu)建邏輯的真正復用。
2. maven的主要概念
- Goal: 類似于ant中的target,指完成一定功能的一個任務(wù)
- Artifact:項目產(chǎn)生物,主要有jar, war, maven插件
- Plug-in:插件,可復用的功能模塊比如,middlegen,statcvs
- POM:項目對象模型(Project Object Model),是項目的一些關(guān)鍵元信息的集合。主要包含項目管理信息、具體的項目描述、開發(fā)小組的構(gòu) 成、源代碼庫(如CVS)和郵件列表、項目依賴的庫文件(開發(fā)時刻依賴和運行時刻依賴)、源代碼、單元測試代碼和資源文件的位置、項目報告
3. maven的依賴管理
maven對項目依賴的庫文件進行集中管理,所有庫文件都以一定結(jié)構(gòu)存放在repository中,并用artifactId,groupId, version三個屬性來標示它們。當項目需要某些庫文件時,只要指明這三個屬性即可。庫文件在repository中存儲結(jié)構(gòu)也和這三個屬性緊密相關(guān),其關(guān)系為${mave.repo.remote}/
maven的repository通常放在對公眾開放的主機上,并由眾多的鏡像構(gòu)成,最主要的是http://www./maven/。選擇哪些repository是通過 Java系統(tǒng)變量maven.repo.remote。比如下面的配置maven.repo.remote=http://ultra/maven/, http://www./maven/,http://boss./maven/,http://mirrors./maven, http://www./maven將使maven從www.,boss., mirrors.,www.四個站點依次尋找依賴的文件。該變量可以在四個地方設(shè)置:
- project.properties,
- build.properties,
- ${maven.home.local}/build.properties
- -D maven命令行,
3. maven的主要功能
maven是個構(gòu)建工具的集成平臺,所有功能都是通過插件實現(xiàn)的。maven內(nèi)置和第三方擴展工具提供了大量功能,除了包括基本的編譯、打包、java文檔生成、運行單元測試外,還有j2ee項目支持,代碼生成,產(chǎn)生測試覆蓋率報告,項目開發(fā)過程各種文檔的發(fā)布。
4. 使用maven的案例分析
背景,輕量級J2EE項目,dhtml+struts+spring+hibernate+dbunit,使用ER模型進行數(shù)據(jù)庫設(shè)計
工具需求:
- 生成各種IDE(如eclipse, InteliJ Idea, JBuilder)的項目工程文件
- 從設(shè)計好的數(shù)據(jù)庫表反向生成Hibernate mapping和POJO、
- 導入導出excel的測試數(shù)據(jù)
- 項目開發(fā)小組還希望能夠通過一個統(tǒng)一的入口迅捷地了解和獲取項目開發(fā)過程的產(chǎn)生物和狀態(tài)報告,比如項目管理者想了解單元測試的結(jié)果和測試覆蓋率、代碼貢獻率;而設(shè)計人員系統(tǒng)通過這樣一個渠道及時把設(shè)計的結(jié)果發(fā)布給編碼人員,如需求描述的文檔、數(shù)據(jù)庫表結(jié)構(gòu)、對象模型等;資深開發(fā)人員則想通過該入口能夠快捷的瀏覽、評審代碼。
- 對于需求1可以使用maven的eclipse, idea, jbuilder插件,這些插件可以生成相應(yīng)的項目工程文件;
- 對于需求2可使用maven-middlegen插件數(shù)據(jù)庫反向工程生成各個實體的Hibernate影射文件,再用maven-hibernate插件將這些文件按模塊組合成單個文件;
- 對于需求3可使用maven-dbunit插件的export-xls和import-xls功能;
- 對于需求4可使用site插件生成并發(fā)布項目信息和項目的各種報告如:代碼交叉引用報告、單元測試報告、CVS代碼狀態(tài)報告等。
5. maven的經(jīng)驗總結(jié)
- 在局域網(wǎng)內(nèi)設(shè)置maven repository的鏡像站點,以便用maven管理開發(fā)組織內(nèi)部的artifact,或其他無法在公共maven repository站點發(fā)布的artifact。并在${maven.home.local}/build.properties中,設(shè)置 maven.repo.remote屬性使其指向該mirror。
- 盡可能使項目的構(gòu)建自動化,一個比較好的工具是crusiecontrol。