Maven 生命周期

1. Maven 構(gòu)建生命周期

Maven 構(gòu)建生命周期就是 Maven 將一個(gè)整體任務(wù)劃分為一個(gè)個(gè)的階段坟募,類(lèi)似于流程圖寒锚,按順序依次執(zhí)行北滥。也可以指定該任務(wù)執(zhí)行到中間的某個(gè)階段結(jié)束昂勒。
Maven 的內(nèi)部有三個(gè)構(gòu)建生命周期井赌,分別是 clean, default, site谤逼。其中 default 生命周期的核心階段如下所示:

default lifecycle

2. 如何使用構(gòu)建生命周期來(lái)完成構(gòu)建工作

  • 可以指定某個(gè)生命周期的階段

執(zhí)行 mvn install 命令,將完成 validate, compile, test, package, verify, install 階段仇穗,并將 package 生成的包發(fā)布到本地倉(cāng)庫(kù)中流部。其中某些帶有連字符的階段不能通過(guò) shell 命令單獨(dú)指定。例如:(pre-, post-, or process-*)

mvn install
  • 可以指定多個(gè)不同構(gòu)建生命周期的階段

執(zhí)行 mvn clean deploy 命令纹坐,首先完成的 clean lifecycle枝冀,將以前構(gòu)建的文件清理,然后再執(zhí)行 default lifecycle 的 validate, compile, test, package, verify, insstall, deploy 階段耘子,將 package 階段創(chuàng)建的包發(fā)布到遠(yuǎn)程倉(cāng)庫(kù)中果漾。

mvn clean deploy

3. 階段與插件的關(guān)系

如上所述,Maven 將構(gòu)建過(guò)程定義為 default lifecycle谷誓,并將 default lifecycle 劃分為一個(gè)個(gè)的階段 phase绒障,這一系列 phase 僅僅是規(guī)定執(zhí)行順序,至于每個(gè)階段做什么工作捍歪?由誰(shuí)來(lái)做户辱?答案就在 插件(plugins) 中。
Maven 對(duì)工程的所有操作實(shí)實(shí)在在的都是由 插件 來(lái)完成的糙臼。一個(gè)插件可以支持多種功能庐镐,稱(chēng)之為目標(biāo)(goal),例如:compiler 插件有兩個(gè)目標(biāo):compile 和 testCompile变逃,分別實(shí)現(xiàn)編譯源代碼 和 編譯測(cè)試代碼必逆。
如何將插件與 Maven 的構(gòu)建生命周期綁定在一起呢?通過(guò)將插件的目標(biāo)(goal)與 build lifecycle 中 phase 綁定到一起,這樣名眉,當(dāng)要執(zhí)行某個(gè) phase 時(shí)粟矿,就調(diào)用插件來(lái)完成綁定的目標(biāo)。
如下圖所示:從圖中可以看出璧针,每一個(gè)階段可以綁定0 個(gè) 或 多個(gè)目標(biāo)嚷炉,每個(gè)插件可以提供 1 個(gè)或多個(gè)目標(biāo)。


build lifecycle & plugin goal

4. 如何為自己的工程創(chuàng)建構(gòu)建生命周期

  • 設(shè)置不同的 packaging 類(lèi)型

在 pom.xml 文件中探橱,packaging 類(lèi)型支持 jar, war, ear, pom 等多種類(lèi)型郑藏,不同的 packaging 類(lèi)型會(huì)使得不同的 phase 綁定不同的 plugin goal酬滤。下面是 packaging 類(lèi)型為 jar 時(shí)歹叮,phase 與 plugin goal 的映射關(guān)系包颁。

階段 目標(biāo)
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar
install install:install
deploy deploy:deploy
  • 配置 plugin

在 pom.xml 文件中, <build> <plugins> 元素下可以添加 <plugin>胞枕,通過(guò)指定 goal 和 phase 來(lái)進(jìn)行綁定杆煞。
例如:將插件 modello-maven-plugin 的 java 目標(biāo)綁定到 generate-sources 階段。

<plugin>
  <groupId>org.codehaus.modello</groupId>
  <artifactId>modello-maven-plugin</artifactId>
  <version>1.8.1</version>
  <executions>
    <execution>
      <configuration>
        <models>
          <model>src/main/mdo/maven.mdo</model>
        </models>
        <version>4.0.0</version>
      </configuration>
      <phase>generate-sources</phase>
      <goals>
        <goal>java</goal>
      </goals>
    </execution>
  </executions>
</plugin>

5. 我沒(méi)有在 pom.xml 指定任何 plugin腐泻,但是也能正常構(gòu)建工程

你可以能會(huì)疑問(wèn)决乎,默認(rèn)的 pom.xml 文件并沒(méi)有配置各種 plugin,但是也能正常構(gòu)建工程派桩?答案是 Maven 自己默認(rèn)指定了 plugin构诚。
下面是一個(gè)沒(méi)有配置任何 plugin 的 pom.xml,執(zhí)行 mvn install 的輸出日志铆惑,從日志中可以看到 一系列的 插件(plugin):版本號(hào):目標(biāo)(phase)范嘱,例如 maven-resources-plugin:2.6:resources (default-resources),maven-compiler-plugin:3.1:compile (default-compile) 员魏,maven-resources-plugin:2.6:testResources (default-testResources)丑蛤,maven-compiler-plugin:3.1:testCompile (default-testCompile),maven-surefire-plugin:2.12.4:test (default-test)撕阎,maven-jar-plugin:2.4:jar (default-jar) 受裹,maven-install-plugin:2.4:install (default-install),

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building my-app 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ my-app ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ my-app ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/zhangguanghui/git/my-app/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ my-app ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/zhangguanghui/git/my-app/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ my-app ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/zhangguanghui/git/my-app/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ my-app ---
[INFO] Surefire report directory: /Users/zhangguanghui/git/my-app/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.mycompany.app.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ my-app ---
[INFO] Building jar: /Users/zhangguanghui/git/my-app/target/my-app-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ my-app ---
[INFO] Installing /Users/zhangguanghui/git/my-app/target/my-app-1.0-SNAPSHOT.jar to /Users/zhangguanghui/.m2/repository/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar
[INFO] Installing /Users/zhangguanghui/git/my-app/pom.xml to /Users/zhangguanghui/.m2/repository/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.726 s
[INFO] Finished at: 2016-11-20T00:41:11+08:00
[INFO] Final Memory: 15M/310M
[INFO] ------------------------------------------------------------------------

5. 完整的 clean, default, site build lifecycle

  • clean lifecycle
phase function
pre-clean execute execute processes needed prior to the actual project cleaning
clean remove all files generated by the previous build
post-clean execute processes needed to finalize the project cleaning
  • default lifecycle
phase function
validate validate the project is correct and all necessary information is available.
initialize initialize build state, e.g. set properties or create directories.
generate-sources generate any source code for inclusion in compilation.
process-sources process the source code, for example to filter any values.
generate-resources generate resources for inclusion in the package.
process-resources copy and process the resources into the destination directory, ready for packaging.
compile compile the source code of the project.
process-classes post-process the generated files from compilation, for example to do bytecode enhancement on Java classes.
generate-test-sources generate any test source code for inclusion in compilation.
process-test-sources process the test source code, for example to filter any values.
generate-test-resources create resources for testing.
process-test-resources copy and process the resources into the test destination directory.
test-compile compile the test source code into the test destination directory
process-test-classes post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes. For Maven 2.0.5 and above.
test run tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed.
prepare-package perform any operations necessary to prepare a package before the actual packaging. This often results in an unpacked, processed version of the package. (Maven 2.1 and above)
package take the compiled code and package it in its distributable format, such as a JAR.
pre-integration-test perform actions required before integration tests are executed. This may involve things such as setting up the required environment.
integration-test process and deploy the package if necessary into an environment where integration tests can be run.
post-integration-test perform actions required after integration tests have been executed. This may including cleaning up the environment.
verify run any checks to verify the package is valid and meets quality criteria.
install install the package into the local repository, for use as a dependency in other projects locally.
deploy done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
  • site lifecycle
phase function
pre-site execute processes needed prior to the actual project site generation
site generate the project's site documentation
post-site execute processes needed to finalize the site generation, and to prepare for site deployment
site-deploy deploy the generated site documentation to the specified web server

6. 參考文檔

參考

maven 入門(mén)指南
maven 生命周期
Maven 默認(rèn)插件以及功能
maven 依賴管理
maven-shade-plugin 入門(mén)指南
maven-assembly-plugin 入門(mén)指南
Introduction to the Build Lifecycle

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虏束,一起剝皮案震驚了整個(gè)濱河市名斟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌魄眉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闷袒,死亡現(xiàn)場(chǎng)離奇詭異坑律,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)晃择,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)冀值,“玉大人,你說(shuō)我怎么就攤上這事宫屠×辛疲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵浪蹂,是天一觀的道長(zhǎng)抵栈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)坤次,這世上最難降的妖魔是什么古劲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮缰猴,結(jié)果婚禮上产艾,老公的妹妹穿的比我還像新娘。我一直安慰自己滑绒,他們只是感情好闷堡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著疑故,像睡著了一般杠览。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上焰扳,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天倦零,我揣著相機(jī)與錄音,去河邊找鬼吨悍。 笑死扫茅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的育瓜。 我是一名探鬼主播葫隙,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼躏仇!你這毒婦竟也來(lái)了恋脚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤焰手,失蹤者是張志新(化名)和其女友劉穎糟描,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體书妻,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡船响,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片见间。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聊闯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出米诉,到底是詐尸還是另有隱情菱蔬,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布史侣,位于F島的核電站拴泌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抵窒。R本人自食惡果不足惜弛针,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望李皇。 院中可真熱鬧削茁,春花似錦、人聲如沸掉房。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卓囚。三九已至瘾杭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哪亿,已是汗流浹背粥烁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝇棉,地道東北人讨阻。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像篡殷,于是被迫代替她去往敵國(guó)和親钝吮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理板辽,服務(wù)發(fā)現(xiàn)奇瘦,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 所有項(xiàng)目的構(gòu)建都是有生命周期的劲弦,這個(gè)生命周期包括:項(xiàng)目清理耳标、初始化、編譯邑跪、測(cè)試麻捻、打包纲仍、集成測(cè)試、驗(yàn)證贸毕、部署、站點(diǎn)生...
    zlcook閱讀 2,769評(píng)論 0 21
  • 1.生命周期 maven有三個(gè)獨(dú)立的有序的生命周期夜赵,分別是clean明棍,default和site。其中clean(用...
    醬油和醋閱讀 1,135評(píng)論 0 0
  • 【補(bǔ)充中】通常一個(gè)Java Web項(xiàng)目構(gòu)建過(guò)程包括清理寇僧、編譯摊腋、測(cè)試、打包嘁傀、集成測(cè)試兴蒸、驗(yàn)證、部署等步驟细办,Maven從...
    泡泡大腳閱讀 341評(píng)論 0 0
  • 殺人者恒殺之橙凳,所以他已死! 死得蹊蹺笑撞,死得詭異岛啸,死得其所! 事實(shí)上茴肥,這卻是諷刺坚踩,縱橫天下的他竟是自殺,天...
    小狗汪汪汪閱讀 354評(píng)論 0 0