一. maven是什么朽们?
maven這個詞可以翻譯成“專家”或“內(nèi)行”留拾,也可以翻譯成“知識的積累”(猶太語)涕侈,是一個跨平臺的項目管理工具。作為Apache組織中的一個頗為成功的開源項目秒旋,maven主要服務(wù)于基于java平臺的項目構(gòu)建约计、依賴管理和項目信息管理。
二. maven都能做什么迁筛?
舉幾個例子直觀感受一下:
a. 我們需要引用各種jar包煤蚌,尤其是較大的工程,引用的jar包往往有幾十個乃至上百個,都需要手動引入工程目錄铺然,而且經(jīng)常遇到各種讓人抓狂的jar包沖突俗孝,版本沖突。
b. 世界上沒有不存在bug的代碼魄健,就像沒有不喜歡美女的男人一樣赋铝。寫完了代碼,我們還要寫一些單元測試沽瘦,然后一個個的運行來檢驗代碼質(zhì)量革骨。
c. 再優(yōu)雅的代碼也是要出來賣的。我們后面還需要把代碼與各種配置文件析恋、資源整合到一起良哲,定型打包。如果是web項目助隧,還需要將之發(fā)布到服務(wù)器筑凫,供人蹂躪。
以上這些并村,maven都可以做到巍实。
1.maven是優(yōu)秀的構(gòu)建工具
前面介紹了maven的用途之一是服務(wù)于構(gòu)建,它是一個異常強(qiáng)大的構(gòu)建工具哩牍,能夠幫我們自動化構(gòu)建過程棚潦,從清理、編譯膝昆、測試到生成報告丸边, 再到打包和部署。我們不需要也不應(yīng)該一遍又一遍地輸入命令荚孵,一次又一次地點擊鼠標(biāo)妹窖,我們要做的是使用maven配置好項目,然后輸入 簡單的命令(如mvn clean install)收叶,maven會幫助我們處理那些繁瑣的任務(wù)骄呼。maven是跨平臺達(dá)到,這意味著無論是在Windows上滔驾,還是Linux 或者M(jìn)ac上,都可以使用同樣的命令俄讹。
2.maven不僅是構(gòu)建工具
maven不僅是構(gòu)建工具哆致,還是一個依賴管理工具和項目信息管理工具。它提供了中央倉庫患膛,能幫助我們自動下載構(gòu)件摊阀。在這個開源的年代里, 幾乎任何的java應(yīng)用都會借用一些第三方的開源類庫,這些類庫都可以通過依賴的方式引入到項目中來胞此。maven提供了一個優(yōu)秀的解決方案臣咖, 它通過一個坐標(biāo)系統(tǒng)準(zhǔn)確地定為每一個構(gòu)件,也就是通過一組坐標(biāo)maven能夠找到任何一個java類庫(如jar文件)漱牵。
maven還能幫助我們管理原本分散在項目中各個角落的項目信息夺蛇,包括項目描述、開發(fā)者列表酣胀、版本控制系統(tǒng)地址刁赦、許可證、缺陷管理系統(tǒng)地址等闻镶。
三. maven入門
1.編寫POM
maven項目的核心是pom.xml甚脉。POM(Project Object Model ,項目對象模型)定義了項目的基本信息铆农,用于描述項目如何構(gòu)建牺氨,聲明項目依賴等等。
代碼的第一行是XML頭墩剖,指定了該xml文檔的版本和編碼方式猴凹。
緊接著是project元素,project是所有pom.xml的根元素涛碑,他還聲明了一些POM相關(guān)的命名空間及xsd元素精堕,這些屬性不是必須的,但使用這些屬性能夠讓第三方工具(如IDE中的XML編輯器)幫助我們快速編輯POM蒲障。
modelVersion指定了當(dāng)前POM模型的版本歹篓,對于maven2和maven3來說,它只能是4.0.0揉阎。
最重要的事groupId庄撮、artifactId、version毙籽。這三個元素定義了一個項目基本的坐標(biāo)洞斯,在maven的世界,任何的jar坑赡、pom或者war都是以基于這些 基本的坐標(biāo)進(jìn)行區(qū)分的烙如。
groupId定義了項目屬于哪個組
artifactId定義了當(dāng)前maven項目在組中的唯一ID
version指定了當(dāng)前demo項目的版本SNAPSHOT意為快照,說明該項目還處于開發(fā)中毅否,是不穩(wěn)定的版本亚铁。
name元素聲明了一個對于用戶更為友好的項目名稱,不是必須的螟加。但推薦為每個pom聲明name徘溢,方便信息交流吞琐。
2.編寫主代碼
項目主代碼和測試代碼不同,主代碼會被打包到最終的構(gòu)件中(如jar)然爆,而測試代碼只在運行測試時用到站粟,不會被打包。 遵循maven的約定曾雕,在絕大多數(shù)情況下奴烙,應(yīng)該把項目的主代碼放到src/main/java目錄下,而無需額外的配置,maven會自動搜尋該目錄 找到項目主代碼。
使用maven進(jìn)行編譯飒责,在項目的根目錄下運行命令 mvn clean compile:
從輸出中看到maven首先執(zhí)行了clean任務(wù),接著執(zhí)行resources任務(wù)趾牧,最后執(zhí)行compile任務(wù)。對應(yīng)了一些maven插件和插件目標(biāo)肯污。 至此翘单,maven在沒有任何額外配置的情況下就執(zhí)行了項目的清理和編譯任務(wù),接下來編寫一些單元測試代碼并讓maven執(zhí)行自動化測試蹦渣。
3.編寫測試代碼
主代碼和測試代碼應(yīng)該分別位于獨立的目錄中哄芜。maven項目中默認(rèn)的主代碼目錄是src/main/java,對應(yīng)的柬唯,maven項目中默認(rèn)的測試代碼目錄是 src/test/java认臊。
在java世界中,由Kent Beck和Erich Gamma建立的JUnit是事實上的單元測試標(biāo)準(zhǔn)锄奢。要使用JUnit失晴,首先要為Hello World項目添加一個JUnit依賴, 修改項目的pom如下圖:
這里添加了一個依賴——groupId是junit拘央,artifactId是junit涂屁,version是4.7。前面提到groupId灰伟,artifactId拆又,version是任何一個maven項目最基本的坐標(biāo)。 有了這段聲明栏账,maven就能自動下載junit-4.7.jar帖族。它會自動訪問中央倉庫,下載需要的文件。
scope元素為依賴范圍挡爵,若依賴范圍為test竖般,則表示該依賴只對測試代碼有效。換句話說了讨,測試代碼中的import JUnit代碼是沒有問題的捻激,但是如果主代碼中用import JUnit就會造成編譯錯誤。如果不聲明依賴范圍前计,默認(rèn)值是compile胞谭,表示該依賴對主代碼和測試代碼都有效。
以下為HelloWorld的測試代碼:
在junit4中男杈,需要執(zhí)行的測試方法都應(yīng)該以@Test進(jìn)行標(biāo)注丈屹。調(diào)用maven進(jìn)行測試,運行 mvn clean test:
分析一下這段輸出:命令行輸入的是mvn clean test伶棒,而maven實際先執(zhí)行的clean旺垒、resources、compile肤无、testResources先蒋。暫時需要了解的是,在maven執(zhí)行測試之前宛渐,他會先自動執(zhí)行項目主資源處理竞漾、主代碼編譯、測試資源處理窥翩、測試代碼編譯等工作业岁,這是maven生命周期的一個特性。后續(xù)講解寇蚊”适保可以看到,我們測試任務(wù)執(zhí)行成功了仗岸。
4.打包和運行
將項目進(jìn)行編譯允耿、測試后,下一個重要步驟就是打包爹梁。HelloWorld的POM中沒有指定打包類型右犹,使用默認(rèn)打包類型jar。簡單的執(zhí)行命令mvn clean package 進(jìn)行打包姚垃,可以看到如下輸出:(簡略版)
類似的念链,maven會在打包之前執(zhí)行編譯、測試等操作积糯。這里看到--- maven-jar-plugin:2.4:jar (default-jar) @ mavendemo ---掂墓,實際上就是jar插件的jar目標(biāo)將項目主代碼打包成一個名為mavendemo-1.0-SNAPSHOT.jar的文件。
至此看成,打包成功君编,如果有需要的話就可以復(fù)制這個jar文件到其他項目的Classpath中從而使用HelloWorld類。但是川慌,如何才能讓其他的maven項目直接引用這個jar呢祠乃?還需要一個安裝的步驟亮瓷,執(zhí)行 mvn clean install:
在打包之后降瞳,又執(zhí)行了安裝任務(wù)install:install。從輸出中可以看到該任務(wù)將項目輸入的jar安裝到了maven本地倉庫除师。我們說只有構(gòu)件被下載到本地倉庫后,才能被所有maven項目使用扔枫。
我們已經(jīng)體驗了maven最主要的命令:mvn clean compile汛聚,mvn clean test,mvn clean package短荐,mvn clean install贞岭。執(zhí)行test之前先執(zhí)行的是compile,執(zhí)行package之前會先執(zhí)行test搓侄,執(zhí)行install之前會先執(zhí)行package瞄桨。
注意到目前為止,還沒有運行HelloWorld項目讶踪,不要忘了HelloWorld類可是有一個main方法的芯侥。默認(rèn)打包生成的jar是不能夠直接運行的,因為帶有main方法的類信息不會添加到manifest中(打開jar文件中的META-INF/MANIFEST.MF文件乳讥,將無法看到Main-Class一行)柱查。為了生成可執(zhí)行的jar文件,需要借助maven-shade-plugin云石,在POM中配置該插件如下:
然后執(zhí)行mvn clean install唉工,構(gòu)建完成后打開target/目錄,可以看到mavendemo-1.0-SNAPSHOT.jar和original-mavendemo-1.0-SNAPSHOT.jar汹忠,前者是可運行的jar淋硝,后者是原始的jar。
現(xiàn)在在項目根目錄下執(zhí)行該jar文件:java -jar target/maven_demo-1.0-SNAPSHOT.jar
控制臺輸出:Hello Maven
到這宽菜,我們介紹了POM谣膳、maven項目結(jié)構(gòu)及如何編譯、測試铅乡、打包等继谚。
四. 坐標(biāo)和依賴
1.坐標(biāo)
maven定義了這樣一組規(guī)則:世界上任何一個構(gòu)件都可以使用maven坐標(biāo)唯一標(biāo)識,maven坐標(biāo)的元素包括groupId阵幸,artifactId芽世,version捂襟,packaging,classifIer涨共。我們只需要提供正確的坐標(biāo)举反,maven就能找到對應(yīng)的構(gòu)件火鼻。從哪找呢魁索?先看一組坐標(biāo)定義:
groupId:定義當(dāng)前maven項目隸屬的實際項目尝偎。
artifactId:該元素定義實際項目中的一個maven項目(模塊)致扯。默認(rèn)情況下抖僵,maven生成的構(gòu)件耍群,其文件名以artifactId作為開頭世吨,如spring-data-mongodb.jar耘婚;
version:該元素定義maven項目當(dāng)前所屬的版本沐祷。
packaging:該元素定義了maven項目的打包方式。上述的例子為jar胞锰,所有最終的文件名為spring-data-mongodb-2.1.5RELEASE.jar嗅榕,而是用war打包方式的maven項目凌那,最終生成的構(gòu)件會有一個.war文件 帽蝶,不過這不是絕對的励稳。默認(rèn)packaging的值為jar驹尼。
classifier:該元素用來幫助定義構(gòu)建輸出的一些附屬構(gòu)件扶欣。附屬構(gòu)件與主構(gòu)件對應(yīng)料祠,如名為A-2.0.0.jar的構(gòu)件髓绽,可能還會使用一些插件生成如A-2.0.0-javadoc.jar顺呕、A-2.0.0-sources.jar這樣一些附屬構(gòu)件株茶。 這里注意:不能直接定義項目的classifier启盛,因為附屬構(gòu)件不是項目默認(rèn)生成的卧抗,而是由附加的插件幫助生成。
2.傳遞性依賴
假設(shè)你正在開發(fā)一個Spring Framework的項目泳秀,如果不用maven,那么在項目中就需要手動下載相關(guān)依賴。由于Spring Framework又會依賴其他開源類庫漠畜,因此實際中往往會下載一個很大的如spring-framework-2.5.6-with-dependencies.zip的包憔狞,這里包含了所有Spring Framework的jar包瘾敢,以及它依賴的其他jar包簇抵,這么做往往就引入了很多不必要的依賴碟摆。另一種做法是只下載spring-framework-2.5.6.zip這樣一個包典蜕,這里不包含其他相關(guān)依賴愉舔,到實際使用的時候轩缤,再根據(jù)出錯信息躺翻,或者查詢相關(guān)文檔公你,加入其他依賴陕靠。很顯然,這是一個很麻煩的事情税肪。
maven的傳遞性依賴可以很好地解決這一問題益兄。假設(shè)A有一個compile范圍的B依賴净捅,B有一個compile范圍的C依賴蛔六,那么我們說A對于B是第一直接依賴国章,B對于C是第二直接依賴捉腥,A對于C是傳遞性依賴抵碟。第一直接依賴的范圍和第二直接依賴的范圍決定了傳遞性依賴的范圍拟逮。
maven引入的傳遞性依賴機(jī)制敦迄,大大簡化和方便了依賴聲明罚屋,另一方面在大部分情況下我們只需要關(guān)心項目的直接依賴是什么,而不用考慮這些直接依賴會引入什么傳遞性依賴撕彤。
3.依賴調(diào)節(jié)
當(dāng)傳遞性依賴造成問題的時候羹铅,我們就需要清楚的知道該傳遞性依賴是從哪條依賴路徑引入的职员。
例如項目A有這樣的依賴關(guān)系:A -> B -> C -> X(1.0)焊切、A -> D -> X(2.0)专肪,X是A的傳遞性依賴牵祟,但是兩條依賴路徑上有兩個版本的X抖格,那么哪個X會被maven解析使用呢雹拄?兩個版本都使用顯然是不對的滓玖,因為那會造成依賴重復(fù)势篡。
maven依賴調(diào)解的第一原則是:路徑最近者優(yōu)先禁悠。該例中X(1.0)的路徑為3碍侦,X(2.0)的路徑長度為2瓷产,因此X(2.0)會被解析使用濒旦。
現(xiàn)在假設(shè)有這樣的依賴關(guān)系:A -> B -> Y(1.0)疤估,A -> B -> Y(2.0)铃拇,Y(1.0)和Y(2.0)的路徑長度都是2,那到底誰會被解析使用呢雕什?
從maven2.0.9開始显晶,為了盡可能避免構(gòu)建的不確定性,maven定義了依賴調(diào)解的第二原則:第一聲明者優(yōu)先偿警。在依賴路徑長度相等的前提下螟蒸,在pom中依賴聲明的順序決定了誰會被調(diào)解使用,順序最靠前的依賴被使用七嫌。
五.倉庫
對于maven倉庫來說诵原,倉庫只分為兩類:本地倉庫和遠(yuǎn)程倉庫挽放。當(dāng)maven根據(jù)坐標(biāo)尋找構(gòu)件的時候,他首先會查看本地倉庫辑畦,如果本地倉庫存在此構(gòu)件航闺,則直接使用猴誊;如果不存在懈叹,或者需要查看是否有更新的構(gòu)件版本,maven就會去遠(yuǎn)程倉庫查找畏吓,發(fā)現(xiàn)需要的構(gòu)件之后肾砂,下載到本地倉庫在使用镐确。如果本地倉庫和遠(yuǎn)程倉庫都沒有需要的構(gòu)件源葫,maven就會報錯息堂。
介紹一些特殊的遠(yuǎn)程倉庫:中央倉庫是maven核心自帶的遠(yuǎn)程倉庫荣堰,它包含了絕大部分開源拿到構(gòu)件持隧。在默認(rèn)配置下,當(dāng)本地倉庫沒有maven需要的構(gòu)件的時候褥实,他會嘗試從中央倉庫下載损离。
私服是另一種遠(yuǎn)程倉庫僻澎,為了節(jié)省帶寬和時間窟勃,應(yīng)該在局域網(wǎng)內(nèi)架設(shè)一個私有的倉庫服務(wù)器秉氧,用其代理所有外部的遠(yuǎn)程倉庫。內(nèi)部的項目還能部署到私服上供其他項目使用亚斋。除了中央倉庫和私服,還有很多其他公開的遠(yuǎn)程倉庫厚掷,不一一介紹了冒黑。
1.本地倉庫
當(dāng)maven執(zhí)行編譯或測試時抡爹,如果需要依賴文件冬竟,他會基于坐標(biāo)使用本地倉庫的依賴文件。默認(rèn)情況下笑诅,不管是在Win上還是Linux上吆你,每個用戶在自己的用戶目錄下都有一個路徑名為.m2/repository/的倉庫目錄妇多。
自定義本地倉庫目錄地址
編輯~/.m2/settings.xml,設(shè)置localRepository元素的值為想要的倉庫地址。需要注意的是烂瘫,默認(rèn)情況下媒熊,~/.m2/settings.xml文件是不存在的,用戶需要從maven安裝目錄復(fù)制$M2_HOME/conf/settings.xml文件再進(jìn)行編輯坟比。?
2.遠(yuǎn)程倉庫
安裝好maven后芦鳍,如果不執(zhí)行任何maven命令,本地倉庫目錄是不存在的葛账。當(dāng)用戶輸入第一條maven命令之后柠衅,mavne才會創(chuàng)建本地倉庫,然后根據(jù)配置和需要籍琳,從遠(yuǎn)程倉庫下載構(gòu)件至本地倉庫菲宴。
這好比藏書。我想看《程序員修煉之道》,我會先看看自己的書房是否有這本書查近。如果沒有,那么我就會去書店買婿禽,買回來放到書房里』煮荩可能有一天我又想讀英文版的了侄柔,書房里只有中文版薪者,于是又去書店找悬槽,發(fā)現(xiàn)書店沒有烟逊,然后我又在網(wǎng)上找,最后在京東買了一本精置,放到自己的書房。
書房就好比本地倉庫离陶。maven需要構(gòu)件的時候先從本地倉庫找谎倔。遠(yuǎn)程倉庫就好比書店孽查,當(dāng)我無法從自己的書房里找到需要的書的時候,就會從書店買回來放到書房里淹冰。當(dāng)maven無法從本地倉庫找到需要的構(gòu)件的時候,就會從遠(yuǎn)程倉庫下載構(gòu)件至本地倉庫驻民。一般來講工禾,對于每個人來說書房只有一個笙隙,但外面的書店有很多憎夷。類似的,對于maven來說怕吴,每個用戶的本地倉庫只有一個煞肾,但可以配置訪問很多遠(yuǎn)程倉庫耸黑。
3.中央倉庫
由于最開始本地倉庫是空的伴郁,maven必須知道至少一個可用的遠(yuǎn)程庫握巢,才能在執(zhí)行maven命令的時候下載到需要的構(gòu)件。中央倉庫就是這樣一個默認(rèn)的遠(yuǎn)程倉庫关炼。中央倉庫包含了這個世界上絕大多數(shù)流行的開源java構(gòu)件,一般來說井氢,一個簡單maven項目所需要的依賴構(gòu)件都可以從中央倉庫下載到奴饮。這也解釋了為什么maven能做到”開箱即用“琢岩。
4.私服
私服是一種特殊的遠(yuǎn)程倉庫泳桦,它是架設(shè)在局域網(wǎng)內(nèi)的倉庫服務(wù)泰鸡,私服代理廣域網(wǎng)上的遠(yuǎn)程倉庫,供局域網(wǎng)內(nèi)的maven用戶使用烟号。當(dāng)maven需要下載構(gòu)件的時候,他從私服請求叽讳,如果私服上不存在此構(gòu)件追他,則從外部的遠(yuǎn)程倉庫下載,緩存在私服上之后岛蚤,再為maven的下載請求提供服務(wù)邑狸。此外,一些無法從外部倉庫下載到的構(gòu)件也能從本地上傳到私服上供大家使用涤妒。
私服的好處:
? ? 節(jié)省自己的外網(wǎng)帶寬
? ? 加速maven構(gòu)建
? ? 部署第三個構(gòu)件
? ? 提高穩(wěn)定性单雾,增強(qiáng)控制
? ? 降低中央倉庫的負(fù)荷
5.遠(yuǎn)程倉庫的配置
有時,默認(rèn)的中央倉庫無法滿足項目的需求她紫,可能項目的構(gòu)件在另一個遠(yuǎn)程倉庫中硅堆,可以在pom中配置該倉庫。如下:
該例中聲明了一個id為jboss贿讹,名稱為JBoss Repository的倉庫渐逃。任何一個倉庫的id必須是唯一的,尤其需要注意的是民褂,maven自帶的中央倉庫使用的id為central茄菊,如果其他的倉庫聲明也用了這個id疯潭,就會覆蓋中央倉庫的配置。url為倉庫地址面殖。
該例子配置中的releases和snapshots元素比較重要袁勺,他們用來控制maven對于發(fā)布版構(gòu)件和快照版構(gòu)件的下載。releases的enabled值為true畜普,表示開啟JBoss倉庫的發(fā)布版本下載支持期丰,而snapshots的enabled值為false,表示關(guān)閉JBoss倉庫的快照版本的下載支持吃挑。因此钝荡,根據(jù)該配置,maven只會從JBoss倉庫下載發(fā)布版的構(gòu)件舶衬,而不會下載快照版的構(gòu)件埠通。
6.遠(yuǎn)程倉庫認(rèn)證
假設(shè)組織內(nèi)部有一個maven倉庫服務(wù)器,該服務(wù)器為每個項目都提供獨立的maven倉庫逛犹,為了防止非法的倉庫訪問端辱,管理員為每個倉庫提供了一組用戶名及密碼。這是為了讓maven訪問倉庫內(nèi)容虽画,就需要配置認(rèn)證信息舞蔽。?
假設(shè)需要給一個id為my-proj的倉庫配置認(rèn)證信息,需要在settings.xml文件中配置:
重點:此id必須與pom中需要認(rèn)證的repository元素的id完全一致码撰。換句話說渗柿,正是這個id將認(rèn)證信息與倉庫配置聯(lián)系在了一起。
7.部署至遠(yuǎn)程倉庫
上文提到脖岛,私服的一大作用是部署第三方構(gòu)件朵栖,包括組織內(nèi)生成的構(gòu)件,以及一些無法從外部倉庫直接獲取的構(gòu)件柴梆。無論是日常開發(fā)中生成的構(gòu)件陨溅,還是版本發(fā)布的構(gòu)件,都需要配置到倉庫中绍在,供其他團(tuán)隊成員使用门扇。
首先要編輯pom.xml文件,配置distributionManagement元素:
repository表示發(fā)布版本構(gòu)件的倉庫揣苏,snapshotRepository表示快照版本的倉庫悯嗓。id為該遠(yuǎn)程倉庫的唯一標(biāo)識,name是為了方便人閱讀卸察,關(guān)鍵的url表示該倉庫的地址脯厨。
往遠(yuǎn)程倉庫部署構(gòu)件的時候,需要認(rèn)證坑质。和剛才一樣合武,需要在settings.xml中創(chuàng)建一個server临梗,其id與倉庫的id一樣。無論從遠(yuǎn)程倉庫下載構(gòu)件稼跳,還是部署構(gòu)件至遠(yuǎn)程倉庫盟庞,當(dāng)需要認(rèn)證的時候,配置的方式是一樣的汤善。
配置正確后什猖,在命令行運行mvn clean deploy,maven就會將項目構(gòu)建輸出的構(gòu)件部署到配置對應(yīng)的遠(yuǎn)程倉庫红淡。
8.快照版本
maven為什么要區(qū)分穩(wěn)定版本和快照版本不狮?
試想一下:假設(shè)小張在開發(fā)模塊A的2.1版本,該版本還未正式發(fā)布在旱,與A一下開發(fā)的還有模塊B摇零,由小王開發(fā),B的功能依賴于A桶蝎。在開發(fā)的過程中驻仅,小張需要經(jīng)常將項目構(gòu)建、輸出登渣,交給小王噪服,供她開發(fā)和集成調(diào)試。
這種情況下绍豁,小張只需要將模塊的版本設(shè)定為2.1-SNAPSHOT芯咧,然后發(fā)布到私服中,再發(fā)布的過程中竹揍,maven會自動為構(gòu)件打上時間戳。有了時間戳邪铲,maven就能隨時找到倉庫中該構(gòu)件.1-SNAPSHOT版本最新的文件芬位。基于快照版本機(jī)制带到,小張在構(gòu)建成功之后才能將構(gòu)件部署至倉庫昧碉,而小王完全可以不用考慮模塊A的構(gòu)建,因為她能確保隨時得到模塊A的最新可用的快照構(gòu)件揽惹。
在項目經(jīng)過完善的測試后需要發(fā)布的時候被饿,就應(yīng)該將快照版本更改為發(fā)布版本。
六.生命周期
初學(xué)者往往會認(rèn)為maven的生命周期是一個整體搪搏,其實不然狭握,maven有三套相互獨立的生命周期,分別為clean疯溺、default论颅、site哎垦。
clean生命周期的目的是清理項目,它包含三個階段:
????????pre-clean 執(zhí)行一些清理前需要完成的任務(wù)恃疯。
????????clean? ? ? 清理上一次構(gòu)建生成的文件
????????post-clean? 執(zhí)行一些清理后需要完成的工作
default生命周期定義了真正構(gòu)建時所需要執(zhí)行的所有步驟漏设,它是所有生命周期中最核心的部分,這里只對重要階段進(jìn)行解釋:
????????compile ???????? 編譯項目的主源碼
? ? ? ? test-compile? ? ? ? 編譯項目的測試代碼
????????test? ? ? ? ? ? ? ? 使用單元測試框架運行測試今妄,測試代碼不會被打包和部署
????????package? ? ? ? 接受編譯好的代碼郑口,打包成可發(fā)布的格式,如JAR
????????install? ? ? ? 將包安裝到maven本地倉庫中盾鳞,供本地其他maven項目使用
????????dapley? ? ? ? ? 將最終的包復(fù)制到遠(yuǎn)程倉庫潘酗,供其他開發(fā)人員和maven項目使用。
site生命周期
site生命周期的目的是建立和發(fā)布項目站點雁仲,maven能夠基于pom所包含的信息仔夺,自動生成一個友好的站點,方便團(tuán)隊交流和發(fā)布項目信息攒砖。該生命周期包含如下階段:
????pre-site 執(zhí)行一些在生成項目站點之前需要完成的工作
????site? ? ? ? ? ? ? ? 生成項目站點文檔
????post-site? ? ? 執(zhí)行一些在生成項目站點之后需要完成的工作
????site-deploy? ? 將生成的項目站點發(fā)布到服務(wù)器上