1. Maven個人使用歷史
我是06年開始接觸Maven的,那個時候Maven+Subversion的組合滿天飛,不用都不好意思了。不過也確實好用,所以後續的項目中基本上都在使用Maven。如果簡單地歸納maven,你可以把它理解爲:maven=build工具+項目(jar包,依賴)管理工具。
一提到maven,大家都會聯想到ant,確實這哥倆乾的活差不多,當然還有很多其它不知名的,比如ivy(一個大摩的同事介紹的)。這裏不去討論他們的優略,所謂技不壓身,多掌握一門工具沒什麼壞處。
2. Maven與CoC
Maven的一大特點就是CoC(Convention over configuration, ruby on rails也是基於這個理念),啥意思呢?就是它已經事先規定好了很多你必須遵守的規則,沒什麼可商量的。CoC的好處就是,一但你適應了,你就省事了,照着做就是。如果你不適應,你一定要自定義,那就鬱悶了。但是,世上哪有絕對j的自由呢?
3. Maven幾個重要概念
假定你已經安裝好了maven,M2_HOME變量(指向maven安裝目錄)設好了,PATH裏也加上了%M2_HOME%\bin。那你在cmd下敲下:
mvn -version
肯定就會顯示出幾行信息,提示你maven以及java的版本。
Maven的配置文件——settings.xml位於%M2_HOME%\conf目錄下,這裏彙集了所有maven的配置信息,一旦出現什麼問題,第一個要查看的就是這個文件。
Repository——前面不是說過,maven一大功用就是jar包管理,那maven把這些jars都藏在哪裏呢?答案就是資料庫——repository。Maven的repository分爲local repository和remote repository,如果你在pom.xml文件裏指定了一個dependency,那麼maven在repository中查找該jar文件的順序爲local repository -> remote repository。local repository缺省爲~/.m2/repository,你也可以在settings.xml中的<localRepository>裏自定義。Remote repository缺省爲http://repo1.maven.org/maven2/ (鏡像:http://mirrors.ibiblio.org/pub/mirrors/maven2/ ),當然你也可以在settings.xml中指定。而且,一般的項目實踐中,我們都需要配置一個公司範圍內的repository,而且所有的jars只能從這個資料庫中來獲取,一般不允許連接到外部的資料庫。
4. Maven與Java項目
分爲兩種情況:1、白手起家;2、已經有現成的project在cvs/svn中。
白手起家:
你可以從別的地方把pom.xml和目錄結構拷貝過來,然後改改。或者你也可以用mvn提供的模板來生成一個項目,模板有很多種,最簡單的命令就是:
mvn archetype:create -DgroupId=com.maven -DartifactId=test_project
已有source code:
在你把source code checkout下來後,如果你的Eclipse裏已經裝了maven插件(安裝好插件後,還需要去Window->Perferences->Maven裏面進行必要的設置,最主要的就是Installations裏面“User Settings”和“Local Repository”兩項,要確保正確),你可以把這些項目直接以maven project(只要有pom.xml文件就可以)的方式導入進來。當然導入之前你最好在命令行下運行一下“mvn clean install -DskipTests”命令以確保這些項目都是可編譯的,如果導入後你發現並未導入成功,比如srm/main/java都沒有被加入到Build Path,那說明導入過程中出錯了(或者pom.xml本身就存在錯誤,這時候需要先fix,或者跑一下上面說到的命令),很簡單,把項目delete然後重新導入,一般就能解決問題。
如果你沒有安裝maven插件或者你不喜歡用它(我的很多同事都不喜歡用Eclipse的maven插件,覺得很慢很容易出問題),你可以用如下的命令:
mvn eclipse:clean eclipse:eclipse(當然在用這個命令時,在生成的.classpath文件裏會用到一個變量M2_REPO,在下面的導入之前,你需要在Eclipse裏設置這個變量並指向你本地的repository)
先把它生成爲普通的java project,然後在Eclipse中把它和其它java project一樣導入進來。有的人會問了,如果我從cvs/svn中checkout下來的sourcecode中已經包含了.project和.classpath文件,我還需要運行上面的命令嗎?我的建議是最好重新運行一遍,而且我是一直不建議將.project/.classpath這類非原始code(也就是可以由別的文件生成)放入到版本控制中的。
Maven項目層次:
一般大的項目,很少只有一個maven project,這個時候就需要管理好這些maven projects之間的層次,一般通用的做法是創建一個parent maven project。然後讓其它項目作爲它的子項目,這樣容易管理。
. |-- my-module | `-- pom.xml `-- pom.xml
這樣你在parent project的pom.xml裏面就可以看到<modules></modules>定義,其中每個module是和目錄名相對應的。在parent pom.xml裏面你可以定義一些公用的依賴,propert,build plugin的自定義等等。而且,在Eclipse裏面導入maven project的時候可以直接選中這個parent pom.xml,然後所以它的子項目都會自動導入。
5. Dependency詳解
maven裏面對jar的引用非常簡單,只需要在pom.xml裏面加上一個dependency即可。但是實際上裏面有很多陷阱,需要好好注意。
第一就是這個version,我們平時一般的寫法會是這樣:
6. Maven與項目部署
還記得在用maven做部署之前,我們用過shell script來做,感覺maven還是簡單了不少。
其實主要的幾個步驟包括:
利用mvn scm plugin從cvs/svn上checkout source code——然後利用Maven Assembly Plugin來組裝source tree生成最終的發佈文件,當然做得專業的會生成一個dstream或者rpm文件,簡單的做法就是生成一個zip文件,然後直接加壓縮即可。
當然,這其中可能會涉及到一些文件的複製,就需要用到maven resources plugin。
How to share resources across projects in Maven: http://www.sonatype.com/people/2008/04/how-to-share-resources-across-projects-in-maven/
這裏將以一個我們實際的項目爲例來具體講講。
7. Maven與Jar文件發佈
有的時候你需要將自己的jar包發佈到公司的repository裏,以便項目發佈的時候或者其他項目能夠使用它,你可以使用maven的命令去deploy。當然,現在一般的repository server都會有一個對應的web管理界面,你可以在那裏deploy你的jar,把groupId,artifactId和version三個參數設置好就行。需要注意的是,如果你是在某個已有的jar上修改了一些類然後deploy上去的,你需要設置好上述三個參數以區分於你要替換的jar。