一朝聋、Maven有哪些優(yōu)點和缺點
優(yōu)點如下:
簡化了項目構建.依賴管理:
易于上手,對于新手可能一個"mvn clean package"命令就可能滿足他的工作
便于與持續(xù)集成工具(jenkins)整合
便于項目升級冀痕,無論是項目本身升級還是項目使用的依賴升級。
有助于多模塊項目的開發(fā)僻他,一個模塊開發(fā)好后,發(fā)布到倉庫吨拗,依賴該模塊時可以直接從倉庫更新,而不用自己去編譯劝篷。
maven有很多插件,便于功能擴展娇妓,比如生產(chǎn)站點活鹰,自動發(fā)布版本等
缺點如下:
maven是一個龐大的構建系統(tǒng)峡蟋,學習難度大
maven采用約定優(yōu)于配置的策略(convention over configuration)华望,雖然上手容易,但是一旦出了問題赖舟,難于調(diào)試。
當依賴很多時宾抓,m2eclipse 老是搞得Eclipse很卡豫喧。
中國的網(wǎng)絡環(huán)境差,很多repository無法訪問紧显,比如google code缕棵, jboss 倉庫無法訪問等孵班。
二招驴、Maven坐標
一般maven使用[groupID,artifactId,version,packaging]來表示一個項目的某個版本别厘,有時還會使用classifier來表示項目的附屬構建,常見的附屬構建有javadoc和sources包触趴。
三、Maven常見的依賴范圍有哪些?
compile:編譯依賴冗懦,默認的依賴方式,在編譯(編譯項目和編譯測試用例)批狐,運行測試用例,運行(項目實際運行)三個階段都有效嚣艇,典型地有spring-core等jar。
test:測試依賴食零,只在編譯測試用例和運行測試用例有效,典型地有JUnit娜搂。
provided:對于編譯和測試有效,不會打包進發(fā)布包中百宇,典型的例子為servlet-api,一般的web工程運行時都使用容器的servlet-api。
runtime:只在運行測試用例和實際運行時有效携御,典型地是jdbc驅動jar包。
system: 不從maven倉庫獲取該jar,而是通過systemPath指定該jar的路徑啄刹。
import: 用于一個dependencyManagement對另一個dependencyManagement的繼承。
四誓军、Maven的生命周期
maven有三套生命周期,分別為:
1昵时、clean 周期:主要用于清理上一次構建產(chǎn)生的文件,可以理解為刪除target目錄
2债查、默認周期瓜挽,
主要階段包含:
process-resources 默認處理src/test/resources/下的文件盹廷,將其輸出到測試的classpath目錄中,
compile 編譯src/main/java下的java文件久橙,產(chǎn)生對應的class,
process-test-resources 默認處理src/test/resources/下的文件,將其輸出到測試的classpath目錄中,
test-compile 編譯src/test/java下的java文件淆衷,產(chǎn)生對應的class,
test 運行測試用例,
package 打包構件,即生成對應的jar, war等,
install將構件部署到本地倉庫,
deploy 部署構件到遠程倉庫
3祝拯、site周期
主要階段包含
site 產(chǎn)生項目的站點文檔
site-deploy 將項目的站點文檔部署到服務器
五、我們經(jīng)常使用“Mvn Clean Package”命令進行項目打包鹰贵,請問該命令執(zhí)行了哪些動作來完成該任務?
在這個命令中我們調(diào)用了maven的clean周期的clean階段綁定的插件任務碉输,以及default周期的package階段綁定的插件任務
默認執(zhí)行的任務有(maven的術語叫goal, 也有人翻譯成目標,我這里用任務啦):
maven-clean-plugin:clean->
maven-resources-plugin:resources->
maven-compile-plugin:compile->
mavne-resources-plugin:testResources->
maven-compile-plugin:testCompile->
maven-jar-plugin:jar
六敷钾、依賴的解析機制
解析發(fā)布版本:如果本地有肄梨,直接使用本地的阻荒,沒有就向遠程倉庫請求众羡。
解析快照版本:合并本地和遠程倉庫的元數(shù)據(jù)文件-groupId/artifactId/version/maven-metadata.xml,這個文件存的版本都是帶時間戳的,將最新的一個改名為不帶時間戳的格式供本次編譯使用辆毡。
解析版本為LATEST,RELEASE,過于復雜舶掖,且解析的結果不穩(wěn)定, 不推薦在項目中使用主慰,感興趣的同學自己去研究,簡而言之就是合并groupId/artifactId/maven-metadata.xml找到對應的最新版本和包含快照的最新版本共螺。
七、插件的解析機制
當我們輸入"mvn dependency:tree"這樣的指令藐不,解析的步驟為:
解析groupID:
maven使用默認的groupID:"org.apache.maven.plugins"或者"org.codehaus.mojo"
解析artifactId(maven的官方叫做插件前綴解析策略)
合并該groupId在所有倉庫中的元數(shù)據(jù)庫文件(maven-metadata-repository.xml)秦效,比如maven官方插件的元數(shù)據(jù)文件所在的目錄為org\apache\maven\plugins雏蛮,該文件下有如下的條目
Maven Dependency Plugin
dependency
maven-dependency-plugin
通過比較這樣的條目阱州,我們就將該命令的artifactId解析為maven-dependency-plugin
解析version
如果你在項目的pom中聲明了該插件的版本,那么直接使用該版本的插件苔货,否則合并所有倉庫中groupId/artifactId/maven-metadata-repository.xml,找到最新的發(fā)布版本夜惭。
對于非官方的插件,有如下兩個方法可以選擇:
1)使用groupId:artifactId:version:goal 來運行滥嘴,好長~~~~~~~~~~
2)在Settings.xml中添加pluginGroup項,這樣maven不能在官方的插件庫中解析到某個插件若皱,那么就可以去你配置的group下查找啦。
八走触、多模塊如何聚合
配置一個打包類型為pom的聚合模塊,然后在該pom中使用<module>元素聲明要聚合的模塊
九互广、對于一個多模塊項目卧土,如果管理項目依賴的版本
通過在父模塊中聲明dependencyManagement和pluginManagement像樊, 然后讓子模塊通過<parent>元素指定父模塊,這樣子模塊在定義依賴是就可以只定義groupId和artifactId生棍,自動使用父模塊的version,這樣統(tǒng)一整個項目的依賴的版本。
十涂滴、一個項目的依賴來源于不同的組織,可能這些依賴還會依賴別的Jar包柔纵,如何保證這些傳遞依賴不會引起版本沖突。
使用<dependency>的<exclusion>元素將會引起沖突的元素排除搁料。
十一、常見的Maven私服的倉庫類型加缘。
(宿主倉庫)hosted repository, (代理倉庫)proxy repository, (倉庫組)group repository
作者:江河洋海
鏈接:http://www.reibang.com/p/03db064707ac
來源:簡書