生命周期
說到生命周期,我們了解的有項目開發生命周期,那麼Maven的生命周期包括什麼?有清理、初始化、編譯、測試、打包、內建測試、部署等基本上所有的建構步驟。也就是說,幾乎所有的項目的建構,都能夠映射到這樣一個生命周期上。
在Maven世界中,所有任務的完成都是依賴于插件的,生命周期各個階段也是。
模闆方法模式在父類中定義算法的整體結構,子類可以通過實作或者重寫父類方法來控制實際的行為,這樣既保證了算法有足夠的可擴充性,又嚴格控制算法的整體結構。
package com.company.template.method;
publicabstract class AbstractBuild
{
public void build()
{
initialize(); //初始化
compile();//編譯
test();//測試
package();//打包
integrationTest();//內建測試
depoly();//部署
}
protected abstract void initialize();
protected abstract void compile());
protected abstract void test();
protected abstract void package();
protected abstract void integrationTest();
protected abstract void depoly();
}
Build()方法定義了整個建構過程,初始化、編譯、測試、打包、內建測試、部署,裡面具體實作由子類實作。
插件機制就列斯月上面這種,在每個建構步驟上都綁定了一個或多個插件行為。
生命周期詳情
我們建構使用過Maven指令mvn clean install、mvnclean deploy,這個在生命周期是什麼作用?
Maven擁有三套互相獨立的生命周期,分别是clean(清理項目)、default(建構項目)、site(建立項目站點),三個周期每個周期都包含一些階段,這些階段是有順序的,後面依賴前面。
Clean生命周期示意圖
pre-clean:執行清理前需要做的工作;
clean:清理上一次的檔案;
post-clean:執行一些清理後需要完成的工作;
Default生命周期
default生周期是真正建構時需要執行的步驟,是所有生命周期中最核心的部分。
示意圖類似clean生命周期,執行也有順序性。
validate、initialize、generate-sources、process-sources、generate-resources、process-resources、complie(編譯)、process-classes、generate-test-sources、process-test-sources、generate-test-resources、process-test-resources、test-compile、process-test-classes、package、pre-integration-test、integration-test、post-integration-test、verify、install、deploy
其實很多階段就是字面上的意思,不做過多解釋。
site生命周期
包括pre-site、site、post-site、site-depoly階段,主要目的是建立和釋出項目站點,maven能夠基于POM包含的資訊,自動生成一個友好的站點,友善團隊交流釋出項目資訊。
我們來看看一開始的mvn clean install指令,使用者執行這個是用了兩個互不幹擾的生命周期,也就是clean和default互相獨立,clean是執行了pre-clean、clean階段,install是執行前面所有從validate到install所有的階段,是以執行完install,包括初始化、編譯、測試、打包、安裝到本地倉庫,這些階段都完成了,不需要使用者手動進行。
插件綁定
Maven的生命周期與插件互相綁定,用以完成實際的建構任務。具體來說,就是生命周期的階段與插件的目标互相綁定。例如default生命周期的compile這一階段,就是compile與maven-compiler-plugin插件的compile目标綁定。
插播一下什麼是插件的目标。
為了能夠提高代碼複用,一個插件往往可以完成很多任務,也就有很多目标,例如maven-dependency-plugin插件的分析、依賴樹等等,目标就是dependency:analyze、dependency:tree、dependency:list。冒号前面是插件字首,後面是插件目标。
一般我們用到的綁定都是内置的綁定,有興趣的可以了解一下自定義綁定,根據業務功能需要,綁定不同的插件來完成,比如你自己寫了一個插件,就會用到自定義綁定。
插件使用
通過Maven-help-plugin可以了解所有的插件資訊。
在指令行使用mvn dependency:tree
從dependency字首中就能夠找到插件maven-dependency-plugin的artifactId,加上groupId和version能夠精确定位到這個插件,列出項目的依賴樹,幫助分析依賴來源。