1. 程式人生 > >Maven聚合模塊與繼承和Maven的生命周期

Maven聚合模塊與繼承和Maven的生命周期

iss lips 平時 watermark 配置文件 高度 執行 clip 計數

端碗吹水

Maven聚合模塊: 因為Maven是提倡模塊化編程的,所以會以多個工程分為多個模塊。如果所有的功能、模塊都寫在一個工程裏的話,不方便於擴展、升級、修改、查看和團隊開發,而且也不方便於模塊的復用。 Maven則是提倡將一個項目拆分成多個工程,每個工程完成一個模塊或功能,這些工程就像零件一般,分別去進行開發,分為多個工程也方便於維護和分工合作。 每個工程模塊可以通過pom配置文件實現串聯,例如配置好pom文件之後,A工程可以直接對B工程的代碼進行調用,C工程可以對A和B工程的代碼進行調用。 因為工程拆分成了多個模塊,即便能串聯也無法進行一個統一的管理,如果【學Java,到凱哥學堂kaige123.com】某個模塊缺少編譯環境或者缺少某些依賴包就會出現整體的錯誤,所以我們需要一個單獨的工程來管理這些模塊,從而實現到統一管理,將這些散開的工程統一管理起來後就可以統一進行編譯、測試或運行,這就是聚合模塊。 按照Maven的聚合方式是把全部的工程都放在一個目錄下,然後統一通過一個pom文件去管理,但是在Eclipse或者其他開發工具裏要做到這一點比較麻煩,需要手動去操作。但是我們可以創建一個單獨的pom工程去實現這個聚合管理:

技術分享

創建完成,這個工程裏就只有一個src的文件夾和pom文件:

技術分享

然後編輯pom配置文件,進行模塊映射:

技術分享

因為只有到上一個目錄才能看到其他的三個工程

然後就可以統一進行編譯、測試或運行了:

技術分享

Maven繼承: Maven的繼承就是將父節點配置的依賴包繼承下來,例如父節點配置了JUnit依賴包,這樣的話只要繼承它的工程都會自動下載此依賴包,就不需要自己再進行配置了。 這個父節點是一個pom工程,所以我們可以直接用管理工程做為父節點。 示例:

技術分享

技術分享

技術分享

因為以上的做法會令所有繼承此父節點的工程都下載此父節點配置的依賴包,但是如果某些工程並非必須需要此依賴包的話,就將此依賴包聲明為無需自動下載依賴:

技術分享

然後繼承此父節點的工程就不會自動下載了:

技術分享

如果有工程要配置此父節點配置的無需自動下載的依賴包,就寫一個依賴即可,只不過不需要寫此依賴包的版本號:

技術分享

技術分享

Maven的生命周期: Maven強大的一個重要的原因是它有一個十分完善的生命周期模型(lifecycle),這個生命周期可以從兩方面來理解,第一,顧名思義,運行Maven的每個步驟都由它來定義的,這種預定義的默認行為使得我們使用Maven變得簡單,相比而言,Ant的每個步驟都要你手工去定義。第二,這個模型是一種標準,在不同的項目中,使用Maven的接口是一樣的,這樣就不用去仔細理解每個項目的構建了,一般情況下,mvn clean install 這樣的命令是通用的。我想,一定是吸收了許多項目的經驗,Maven才能定義出如此完善的模型。 Maven有三套相互獨立的生命周期,請註意這裏說的是“三套”,而且“相互獨立”,初學者容易將Maven的生命周期看成一個整體,其實不然。這三套生命周期分別是: ?Clean Lifecycle 在進行真正的構建之前進行一些清理工作。 ?Default Lifecycle 構建的核心部分,編譯,測試,打包,部署等等。 ?Site Lifecycle 生成項目報告,站點,發布站點。 我再次強調一下它們是相互獨立的,你可以僅僅調用clean來清理工作目錄,僅僅調用site來生成站點。當然你也可以直接運行 mvn clean install site 運行所有這三套生命周期。 每套生命周期都由一組階段(Phase)組成,我們平時在命令行輸入的命令總會對應於一個特定的階段。比如,運行mvn clean ,這個的clean是Clean生命周期的一個階段。有點繞?要知道有Clean生命周期,也有clean階段。Clean生命周期一共包含了三個階段: ?pre-clean 執行一些需要在clean之前完成的工作 ?clean 移除所有上一次構建生成的文件 ?post-clean 執行一些需要在clean之後立刻完成的工作 分支圖:

技術分享

mvn clean 中的clean就是上面的clean,在一個生命周期中,運行某個階段的時候,它之前的所有階段都會被運行,也就是說,mvn clean 等同於 mvn pre-clean clean ,如果我們運行 mvn post-clean ,那麽 pre-clean,clean 都會被運行。這是Maven很重要的一個規則,可以大大簡化命令行的輸入。 下面看一下Site生命周期的各個階段: ?pre-site 執行一些需要在生成站點文檔之前完成的工作 ?site 生成項目的站點文檔 ?post-site 執行一些需要在生成站點文檔之後完成的工作,並且為部署做準備 ?site-deploy 將生成的站點文檔部署到特定的服務器上 分支圖:

技術分享

這裏經常用到的是site階段和site-deploy階段,用以生成和發布Maven站點,這可是Maven相當強大的功能,Manager比較喜歡,文檔及統計數據自動生成,很好看。 最後,來看一下Maven的最重要的Default生命周期,絕大部分工作都發生在這個生命周期中,這裏,我只解釋一些比較重要和常用的階段:

技術分享

記住,運行任何一個階段的時候,它前面的所有階段都會被運行,這也就是為什麽我們運行mvn install 的時候,代碼會被編譯,測試,打包。

Maven插件: Maven的核心分發包只有不到3MB的大小,Maven會在需要的時候下載並使用插件,對於插件本身,為了能夠復用代碼,它往往能夠完成多個任務。Maven的生命周期與插件相互綁定,用以完成實際的【學Java,到凱哥學堂kaige123.com】構建任務。具體而言是生命周期的階段與插件的目標相互綁定,以完成某個具體的構建任務。 一個插件通常可以完成多個任務,每一個任務就叫做插件的一個目標。如執行mvn install命令時,調用的插件和執行的插件目標如下:

技術分享

Maven的生命周期是抽象的,實際需要插件來完成任務,這一過程是通過將插件的目標(goal)綁定到生命周期的具體階段(phase)來完成的。如:將maven-compiler-plugin插件的compile目標綁定到default生命周期的compile階段,完成項目的源代碼編譯:

技術分享

內置的綁定:   Maven對一些生命周期的階段(phase)默認綁定了插件目標,因為不同的項目有jar、war、pom等不同的打包方式,因此對應的有不同的綁定關系,其中針對default生命周期的jar包打包方式的綁定關系如下:

技術分享

第二列中,冒號後面即是綁定的插件目標,冒號前面是插件的前綴(prefix),是配置和使用插件的一種簡化方式。Plugin Prefix。

自定義綁定: 用戶可以根據需要將任何插件目標綁定到任何生命周期的階段,如:將maven-source-plugin的jar-no-fork目標綁定到default生命周期的package階段,這樣,以後在執行mvn package命令打包項目時,在package階段之後會執行源代碼打包,生成如:ehcache-core-2.5.0-sources.jar形式的源碼包。

技術分享

配置插件 Maven插件高度易擴展,可以方便的進行自定義配置。如:配置maven-compiler-plugin插件編譯源代碼的JDK版本為1.7:

技術分享

整體的語法規則:

技術分享

Maven聚合模塊與繼承和Maven的生命周期