公司項目緊谱秽,好久沒有寫文章敢订。最近幾天打開簡書發(fā)現(xiàn)寫的兩篇關于maven的文章盡然還有讀者在閱讀响巢,那必定maven在國內(nèi)還是有應用場景的泄朴。為了幫助更多的讀者少走彎路重抖,我決定我對maven的研究再總結(jié)分享一下。對于maven我前前后后研究了三個月的樣子祖灰,然后公司的構(gòu)建工具轉(zhuǎn)換到了gradle钟沛。喜歡折騰的讀者建議去看下Facebook的開源構(gòu)建工具buck和Google的bazel。這兩個才是構(gòu)建工具的終極目標局扶。
回到正題恨统,還是聊聊maven。當你在終端或者IDE中執(zhí)行mvn clean時三妈,很多讀者不明白到底發(fā)生了什么畜埋。那我們執(zhí)行下mvn -h看看究竟:
usage: mvn [options] [<goal(s)>] [<phase(s)>]
也就是說mvn命令參數(shù)可以包含0個或者多個goal、phase畴蒲。在前文中我們聊到了lifecycle悠鞍、plugin、phase模燥、goal之間的關系咖祭,如下圖:
從圖中可以看到,一個plugin中可以包含多個goal蔫骂,goal可以綁定到lifecycle中的某一個phase么翰,這樣在執(zhí)行這個phase的時候就會調(diào)用該goal。那那些沒有綁定到phase上的goal應該如何執(zhí)行呢辽旋?這就是
mvn [goal(s)]
所表達的用法浩嫌,這里的goal也就是官方文檔中所說的standalone goal,也就是說若一個plugin中的某個goal沒有和一個phase進行綁定补胚,可以通過這種方式來執(zhí)行固该。可能有的讀者使用過
mvn dependency:tree
這條命令糖儡,這里其實就是單獨執(zhí)行一個goal,這個goal的作用是分析該工程的依賴并使用樹狀的形式打印出來怔匣。這里的dependency:tree其實是一個簡寫的形式握联,其完整形式是:
mvn org.apache.maven.plugins:maven-dependency-plugin:<版本號信息>:tree
也就是說單獨執(zhí)行一個goal的方式是:
mvn <groupId>:<artifactId>:<version>:<goal>
每次都要敲這么長一串命令是很繁瑣的桦沉,因此才有了上述的簡寫的形式。maven規(guī)定了對于plugin的artifactId是如下兩種形式:
maven-${prefix}-plugin
${prefix}-maven-plugin
的可以使用簡寫的方式${prefix}來表示一個plugin金闽。到此為止纯露,dependency:tree的含義應該十分明朗了。一個lifecycle定義了其包含的phase代芜,maven有三個內(nèi)置的lifecycle:default埠褪、clean和site在這里。這三個lifecycle定義了其包含的phase挤庇。maven會在這三個lifecycle中匹配對應的phase钞速。當執(zhí)行某個phase時,maven會依次執(zhí)行在這個phase之前的phase嫡秕。 回到上文所提出的那個問題渴语,mvn clean到底表示什么含義?這里的clean就是一個clean lifecycle中定義的一個phase昆咽,這個clean phase綁定了一個goal->clean:clean驾凶,而這個簡寫的形式所對應的完整形式為org.apache.maven.plugins:maven-clean-plugin:<版本號>:clean,因此以下三種形式都是等價的:
mvn clean
mvn clean:clean
mvn org.apache.maven.plugins:maven-clean-plugin:<版本號>:clean
有興趣的讀者可以敲敲代碼驗證一下掷酗。
其實調(diào)試是一個很好的學習方式调违,通過調(diào)試你可以分析程序內(nèi)部到底是如何執(zhí)行的,maven提供了一種很簡單的調(diào)試方法泻轰,只要在執(zhí)行maven命令時定義環(huán)境變量
MAVEN_OPTS=Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
設置了這個環(huán)境變量后技肩,執(zhí)行任何maven命令都會被阻塞,等待debugger來attach糕殉。
下面還是以mvn clean為例,來看看這個命令到底干了什么阿蝶。根據(jù)上文講解雳锋,我們需要下載maven-clean-plugin源碼,這里已2.4.1版本的源碼為例羡洁。clean這個goal在maven-clean-plugin對應的就是CleanMojo這個類玷过,因此我們將斷電設置在CleanMojo這個類的execute方法上,如下圖:
接下來我們就要設置一個Remote類型的debugger筑煮,其配置的端口號就是MAVEN_OPTS中的address對應的值辛蚊,配置如下:
設置好了之后接下里點擊debug按鈕后,就可以斷點調(diào)試分析了真仲。
若有有疑問請留言袋马。