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