Maven使用心得

 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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章