欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Maven中生命周期的具體使用

 更新時(shí)間:2023年09月01日 09:07:39   作者:怪 咖@  
在 Maven 出現(xiàn)之前,項(xiàng)目構(gòu)建的生命周期就已經(jīng)存在,本文主要介紹了Maven中生命周期的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下

本篇文章重點(diǎn)針對(duì)這幾個(gè)問(wèn)題進(jìn)行講解:

  • maven的生命周期都有哪些階段?
  • maven的生命周期和插件到低有什么關(guān)聯(lián)?
  • 插件和插件的目標(biāo)有什么關(guān)聯(lián)?
  • 假如我們要用某個(gè)插件,怎么上官網(wǎng)查找?
  • 怎么手動(dòng)調(diào)用插件?

一、生命周期(clean+site+default)

在 Maven 出現(xiàn)之前,項(xiàng)目構(gòu)建的生命周期就已經(jīng)存在,開(kāi)發(fā)人員每天都在對(duì)項(xiàng)目進(jìn)行清理,編譯,測(cè)試及部署,但由于沒(méi)有統(tǒng)一的規(guī)范,不同公司甚至不同項(xiàng)目之間的構(gòu)建的方式都不盡相同。

Maven 從大量項(xiàng)目和構(gòu)建工具中學(xué)習(xí)和反思,最后總結(jié)了一套高度完美的,易擴(kuò)展的生命周期。這個(gè)生命周期將項(xiàng)目的清理、初始化、編譯、測(cè)試、打包、集成測(cè)試、驗(yàn)證、部署和站點(diǎn)生成等幾乎所有構(gòu)建過(guò)程進(jìn)行了抽象和統(tǒng)一。

1、生命周期與插件的關(guān)系

Maven 生命周期是抽象的,其本身不能做任何實(shí)際工作,這些實(shí)際工作(如源代碼編譯)都通過(guò)調(diào)用 Maven 插件 中的插件目標(biāo)(plugin goal)完成的。 

為了更好的理解 Maven 生命周期、插件以及插件目標(biāo)三者的關(guān)系,我們可以 將 Maven 生命周期理解成一個(gè)抽象父類(lèi) 將插件理解成其子類(lèi) , 將插件目標(biāo)理解成子類(lèi)中重寫(xiě)的方法 ,其基本結(jié)構(gòu)與下面的示例代碼相似。

/**
* 模擬 maven 生命周期
*/
public abstract class LifeCycle {
    //定義構(gòu)建過(guò)程
    public void build() {
        //模擬生命周期各個(gè)階段,即調(diào)用插件中目標(biāo)
        clean();
        initialize();
        compile();
        packager();
        install();
    }
    //定義清理的過(guò)程
    public abstract void clean();
    //定義初始化的過(guò)程
    public abstract void initialize();
    //定義編譯的過(guò)程
    public abstract void compile();
    //定義打包的過(guò)程
    public abstract void packager();
    //定義安裝的過(guò)程
    public abstract void install();
}

模擬 clean 插件的子類(lèi),代碼如下。

/**
* 子類(lèi)模擬clean 相關(guān)的插件
*/
public abstract class CleanPlugin extends LifeCycle {
    //重寫(xiě)父類(lèi)(生命周期)的清理工作
    //模擬插件目標(biāo)
    @Override
    public void clean() {
        System.out.println("清理");
    }
}

以上示例中,父類(lèi) LifeCycle 模擬的是 Maven 生命周期,子類(lèi) CleanPlugin 模擬的是 Maven 插件,而子類(lèi)中重寫(xiě)的 clean() 模擬的是插件目標(biāo)。插件的本意就是插拔式的,用了添加不用不添加。

雖然示例中的代碼與 Maven 實(shí)際代碼相去甚遠(yuǎn),但它們的基本理念是方法相同的。生命周期抽象了構(gòu)建的各個(gè)步驟,定義了它們的執(zhí)行順序,但卻沒(méi)有提供具體的實(shí)現(xiàn)。插件中完成了對(duì)構(gòu)建過(guò)程的實(shí)現(xiàn),想要完成某個(gè)構(gòu)建步驟, 調(diào)用插件中的一個(gè)或多個(gè)插件目標(biāo)即可。

2、maven的三套生命周期

Maven 的生命周期并非只有一套,而是有三套, 并且這三套生命周期之間是沒(méi)有關(guān)系的 。一套生命周期包含很多個(gè)不同的階段,這些不同的階段是有順序的,有些階段必須要在某個(gè)階段完成之后,才能進(jìn)行。Maven 的三套生命周期分別為:clean(清理),default(默認(rèn)),site(站點(diǎn))。接下來(lái)我們就一一介紹一下這三個(gè)生命周期。

clean:用于清理項(xiàng)目,clean 生命周期包括以下 3 個(gè)階段:

  • pre-clean: 清理前的準(zhǔn)備工作;
  • clean:清理上一次構(gòu)建的結(jié)果;
  • post-clean:清理結(jié)束后需要完成的工作。

default:default 生命周期定義了項(xiàng)目真正構(gòu)建時(shí)所需要的所有步驟,它是所有生命周期中最核心,最重要的部分。

default 生命周期包含非常多的階段,如下表:

site:sit 生命周期的目的是建立和部署項(xiàng)目站點(diǎn),Maven 能夠根據(jù) POM 包含的信息,自動(dòng)生成一個(gè)友好的站點(diǎn),該站點(diǎn)包含一些與該項(xiàng)目相關(guān)的文檔。

site 生命周期包含以下 4 個(gè)階段:

  • pre-site:準(zhǔn)備階段。在生成站點(diǎn)前所需要做的工作;
  • site:生成站點(diǎn)階段;
  • post-site:結(jié)束階段。生成站點(diǎn)結(jié)束后所需要做的工作;
  • site-deploy:發(fā)布階段。我們可以將上面生成的站點(diǎn)發(fā)布到對(duì)應(yīng)服務(wù)器中。

3、生命周期執(zhí)行規(guī)則

每套生命周期包含一系列的構(gòu)建階段(phase),這些階段是有順序的,且后面的階段依賴于前面的階段。用戶與 Maven 最直接的交互方式就是調(diào)用這些生命周期階段。

以 clean 生命周期為例,它包含 pre-clean、clean 以及 post-clean 三個(gè)階段,當(dāng)用戶調(diào)用 pre-clean 階段時(shí),則只有 pre-clean 階段執(zhí)行;當(dāng)用戶調(diào)用 clean 階段時(shí),pre-clean 和 clean 階段都會(huì)執(zhí)行。當(dāng)用戶調(diào)用 post-clean 階段時(shí),則 pre-clean、clean 以及 post-clean 三個(gè)階段都會(huì)執(zhí)行。

三套生命周期本身是相互獨(dú)立的,用戶可以只調(diào)用 clean 生命周期的某個(gè)階段,也可以只調(diào)用 default 生命周期的某個(gè)階段,而不會(huì)對(duì)其他生命周期造成任何影響。當(dāng)然也可以同時(shí)調(diào)用兩套生命周期的某個(gè)階段。

通過(guò)將階段名傳遞給 mvn 命令,就可以調(diào)用構(gòu)建階段,例如: mvn clean ,就是調(diào)用clean生命周期的clean階段,當(dāng)前項(xiàng)目的target目錄會(huì)被清空。

我們?cè)囍鴪?zhí)行 Maven 的打包命令: mvn package -DskipTests (-DskipTests是跳過(guò)測(cè)試的意思,假如不跳過(guò)測(cè)試,他在打包的時(shí)候會(huì)自動(dòng)執(zhí)行項(xiàng)目test目錄下帶有@Test注解的方法)。就是調(diào)用default生命周期的package 階段,執(zhí)行完成之后,可以看到其所經(jīng)過(guò)的生命周期。因此,當(dāng)我們想要構(gòu)建項(xiàng)目的時(shí)候,并不需要分別執(zhí)行 package 階段之前的階段,而是 Maven 自動(dòng)為我們執(zhí)行。突然發(fā)現(xiàn),原來(lái)構(gòu)建項(xiàng)目是如此的簡(jiǎn)單,方便。

生命周期中的每個(gè)構(gòu)建過(guò)程都可以綁定一個(gè)或多個(gè)插件目標(biāo) ,且 Maven 為大多數(shù)的構(gòu)建步驟都綁定了默認(rèn)的插件。例如,針對(duì)源代碼編譯的插件是 maven-compiler-plugin、針對(duì)集成測(cè)試的插件是 maven-surefire-plugin 等(關(guān)于這一點(diǎn)后面會(huì)細(xì)說(shuō))。

同時(shí)我們也可以執(zhí)行兩套生命周期,例如調(diào)用clean生命周期的clean階段再加上default生命周期的package階段: mvn clean package -DskipTests

二、Maven插件(plugin)

1、兩種類(lèi)型的插件

Maven 實(shí)際上是一個(gè)依賴插件執(zhí)行的框架 ,它執(zhí)行的每個(gè)任務(wù)實(shí)際上都由插件完成的。使用Maven打出來(lái)的包并不包含任何 Maven 插件,它們以獨(dú)立構(gòu)件的形式存在, 只有在 Maven 需要使用某個(gè)插件時(shí),才會(huì)去倉(cāng)庫(kù)中下載。

如下表所示,Maven 提供了如下 2 種類(lèi)型的插件:

2、調(diào)用插件有兩種方式

插件目標(biāo): 對(duì)于 Maven 插件而言,為了提高代碼的復(fù)用性,通常一個(gè) Maven 插件能夠?qū)崿F(xiàn)多個(gè)功能,每一個(gè)功能都是一個(gè)插件目標(biāo),即 Maven 插件是插件目標(biāo)的集合。我們可以把插件理解為一個(gè)類(lèi),而插件目標(biāo)是類(lèi)中的方法,調(diào)用插件目標(biāo)就能實(shí)現(xiàn)對(duì)應(yīng)的功能。

使用的兩種方式:

引入到項(xiàng)目當(dāng)中,然后將插件綁定到指定的生命周期,然后執(zhí)行聲明周期命令會(huì)自動(dòng)調(diào)用該插件,例如: mvn clean、mvn install

通過(guò)如下命令可以直接調(diào)用插件。

  • 使用 Maven 命令執(zhí)行插件的目標(biāo),語(yǔ)法如: mvn [插件名]:[目標(biāo)名]
  • 例如,調(diào)用 maven-compiler-plugin 插件的 compile 目標(biāo),命令如: mvn compiler:compile (注意不能使用插件的全名,一定是縮寫(xiě)名,不然會(huì)報(bào)找不到插件)

插件綁定: 為了完成某個(gè)具體的構(gòu)建任務(wù), Maven 生命周期的階段需要和 Maven 插件的目標(biāo)相互綁定 。例如,代碼編譯任務(wù)對(duì)應(yīng)了default 生命周期的 compile 階段,而 maven-compiler-plugin 插件的 compile 目標(biāo)能夠完成這個(gè)任務(wù),因此將它們進(jìn)行綁定就能達(dá)到代碼編譯的目的。

3、內(nèi)置綁定

Maven 默認(rèn)為一些核心的生命周期階段綁定了插件目標(biāo),當(dāng)用戶調(diào)用這些階段時(shí),對(duì)應(yīng)的插件目標(biāo)就會(huì)自動(dòng)執(zhí)行相應(yīng)的任務(wù)。

表中,default 生命周期中只列出了綁定了插件目標(biāo)的階段,它還有很多其他的階段,但這些階段默認(rèn)沒(méi)有綁定任何插件目標(biāo),因此它們也沒(méi)有任何實(shí)際的行為。

我們可以直接在執(zhí)行 Maven 命令看到該構(gòu)建過(guò)程包含了哪些插件目標(biāo)。例如,在 Maven 項(xiàng)目中執(zhí)行 mvn clean install 命令,能看到如下輸出,圖中標(biāo)記的部分就是執(zhí)行此命令時(shí)所調(diào)用的插件目標(biāo)。

像這些內(nèi)置綁定的插件我們也可以在項(xiàng)目當(dāng)中去顯示的聲明然后修改配置,這時(shí)候內(nèi)置綁定插件的默認(rèn)配置將會(huì)被覆蓋!

4、自定義綁定插件

除了內(nèi)置綁定之外,用戶也可以自己選擇將某個(gè)插件目標(biāo)綁定到 Maven 生命周期的某個(gè)階段上,這種綁定方式就是自定義綁定。自定義綁定能夠讓 Maven 在構(gòu)建過(guò)程中執(zhí)行更多更豐富的任務(wù)。

例如,我們想要在 clean 生命周期的 clean 階段中顯示自定義文本信息,則只需要在項(xiàng)目的 POM 中 ,通過(guò) build 元素的子元素 plugins,將 maven-antrun-plugin插件的run 目標(biāo) 綁定到 clean 階段上,并使用該插件輸出自定義文本信息即可。

<build>
	<plugins>
        <!-- 綁定插件 maven-antrun-plugin -->
        <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-antrun-plugin</artifactId>
              <version>3.0.0</version>
              <executions>
                  <execution>
                    <!--自定義 id -->
                    <id>custom clean</id>
                    <!--插件目標(biāo)綁定的構(gòu)建階段 -->
                    <phase>clean</phase>
                    <!--插件目標(biāo) -->
                    <goals>
                    	<goal>run</goal>
                    </goals>
                    <!--配置 -->
                    <configuration>
                      	<!-- 執(zhí)行的任務(wù) -->
                    	<target>
                        	<!--自定義文本信息 -->
                        	<echo message="清理階段"/>
                      </target>
                    </configuration>
                  </execution>
              </executions>
          </plugin>
	</plugins>
</build>

以上配置中除了插件的坐標(biāo)信息之外,還通過(guò) executions 元素定義了一些執(zhí)行配置。executions 下的每一個(gè) executin 子元素都可以用來(lái)配置執(zhí)行一個(gè)任務(wù)。execution 下各個(gè)元素含義如下:

  • id:任務(wù)的唯一標(biāo)識(shí)。
  • phase:插件目標(biāo)需要綁定的生命周期階段。
  • goals:用于指定一組插件目標(biāo),其子元素 goal 用于指定一個(gè)插件目標(biāo)。
  • configuration:該任務(wù)的配置,其子元素 tasks 用于指定該插件目標(biāo)執(zhí)行的任務(wù)。

執(zhí)行命令 mvn clean ,結(jié)果如下:

以上我們只是簡(jiǎn)單使用maven-antrun-plugin插件的run目標(biāo)綁定到了clean階段打印了一段文字,實(shí)際我們還可以通過(guò)該插件來(lái)完成一些特殊工作,例如打包過(guò)后自動(dòng)將包上傳到指定位置等等…這里就不細(xì)說(shuō)了。

插件的運(yùn)行順序: 當(dāng)插件目標(biāo)綁定到生命周期的不同階段時(shí),其執(zhí)行順序由生命周期階段的先后順序決定。如果多個(gè)目標(biāo)綁定到同一個(gè)生命周期階段,其執(zhí)行順序與插件聲明順序一致,先聲明的先執(zhí)行,后聲明的后執(zhí)行。

三、官網(wǎng)查找插件

官網(wǎng):https://maven.apache.org/plugins/index.html

這里就拿maven-antrun-plugin插件來(lái)說(shuō),首先打開(kāi)官網(wǎng)然后搜索antrun,如下:

點(diǎn)擊antrun進(jìn)來(lái)以后看到如下:

點(diǎn)擊目標(biāo)進(jìn)來(lái)以后可以看到該插件可配置的標(biāo)簽:

注意:光看標(biāo)簽有時(shí)候根本不知道怎么用,盡量配合著用法示例來(lái)使用。

點(diǎn)擊 Using <target/> Attributes用法示例如下:

并不是所有的插件都是maven開(kāi)發(fā)的,還有一些其他公司進(jìn)行開(kāi)發(fā)的,如下:

到此這篇關(guān)于Maven中生命周期的具體使用的文章就介紹到這了,更多相關(guān)Maven 生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論