maven_04_生命週期和插件

一、前言

除了座標、依賴以及倉庫之外,Maven另外兩個核心概念是生命週期和插件。

生命週期是抽象,插件是其具體實現。

二、生命週期

Maven的生命週期就是對所有的構建過程進行抽象和統一,包含了項目的清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等幾乎所有構建步驟。

Maven的生命週期是抽象的,這意味着生命週期本身不做任何實際的工作,在Maven的設計中,實際的任務(如編譯源代碼)都交由插件來完成。這種思想與設計模式中的模板方法(TemplateMethod)非常相似。

每個構建步驟都可以綁定一個或者多個插件行爲,而且Maven爲大多數構建步驟編寫並綁定了默認插件。例如,針對編譯的插件有maven-compiler-plugin,針對測試的插件有maven-surefire-plugin等。

1.三套生命週期

maven有三套生命週期:clean、 default、site

三套生命週期相互獨立,每個生命週期包含一些階段(phase),這些階段是有順序的,並且後面的階段依賴於前面的階段,

1.1 clean

清理項目

它包含三個階段:

1)pre-clean執行一些清理前需要完成的工作。

2)clean清理上一次構建生成的文件。

3)post-clean執行一些清理後需要完成的工作。

1.2 default

定義了項目構建時所需要執行的所有步驟

這裏只列出比較重要的階段:

  • process-sources:處理項目主資源文件。

    一般來說,是對src/main/resources目錄的內容進行變量替換等工作後,複製到項目輸出的主classpath目錄中。

  • compile:編譯項目的主源碼。

    一般來說,是編譯src/main/java目錄下的Java文件至項目輸出的主classpath目錄中。

  • process-test-sources:處理項目測試資源文件。

    一般來說,是對src/test/resources目錄的內容進行變量替換等工作後,複製到項目輸出的測試classpath目錄中。

  • test-compile:編譯項目的測試代碼。

    一般來說,是編譯src/test/java目錄下的Java文件至項目輸出的測試classpath目錄中

  • test:使用單元測試框架運行測試,測試代碼不會被打包或部署。

  • package:接受編譯好的代碼,打包成可發佈的格式,如JAR。

  • install:將jar包安裝到Maven本地倉庫,供本地其他Maven項目使用。

  • deploy:將最終的包複製到遠程倉庫,供其他開發人員和Maven項目使用。

1.3 site

建立和發佈項目站點,Maven能夠基於POM所包含的信息,自動生成一個友好的站點,方便團隊交流和發佈項目信息。

該生命週期包含如下階段:

  • pre-site:執行一些在生成項目站點之前需要完成的工作。
  • site:生成項目站點文檔。
  • post-site:執行一些在生成項目站點之後需要完成的工作。
  • site-deploy:將生成的項目站點發布到服務器上。

2.常用命令行命令

  • mvn clean install : 清理項目,然後安裝jar包到maven本地倉庫
  • mvn test : 執行測試
  • mvn clean deploy : 清理項目,然後發佈jar包到遠程倉庫

三、插件

1.插件目標

Maven的核心僅僅定義了抽象的生命週期,具體的任務是交由插件完成的,插件以獨立的構件形式存在。

一個插件可以完成多個任務,而這每一個任務就是一個插件目標。

例如,maven-dependency-plugin 有許多插件目標:dependency:analyze、dependency:tree 和 dependency:list。

冒號前面是插件前綴,冒號後面是插件目標。

2.插件綁定

Maven生命週期的階段與插件的目標相互綁定,以完成某個具體的構建任務。

2.1 內置綁定

爲了能讓用戶幾乎不用任何配置就能構建Maven項目,Maven在覈心爲一些主要的生命週期階段綁定了很多插件的目標,當用戶通過命令行調用生命週期階段的時候,對應的插件目標就會執行相應的任務。

2.2 自定義綁定

Maven支持將某個插件目標綁定到生命週期的某個階段上

3.插件配置

3.1 命令行參數

可通過命令行參數來配置插件,如:

mvn clean install -Dmaven.test.skip=true

參數-D是Java自帶的,其功能是通過命令行設置一個Java系統屬性

3.2 POM中插件全局配置

有些參數的值從項目創建到項目發佈都不會改變,或者說很少改變,對於這種情況,在POM文件中一次性配置就顯然比重複在命令行輸入要方便。

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <encoding>UTF-8</encoding>
          <compilerArguments>
            <extdirs>${project.basedir}/lib</extdirs>
          </compilerArguments>
        </configuration>
      </plugin>
  • 通過插件 <configuration> 節點可進行插件的全局配置。

  • 全局配置的意思是在插件對應的生命週期的所有階段都採用此配置。

3.3 POM中插件任務配置

除了爲插件配置全局的參數,用戶還可以爲某個插件任務配置特定的參數。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>1.3</version>
      <executions>
        <execution>
          <id>ant-validate</id>
          <phase>validate</phase>
          <goals>
            <goal>run</goal>
          </goals>
          <configuraction>
            <tasks>
              <echo>I'm bound to validate phase.</echo>
            </tasks>
          </configuraction>
        </execution>
        <execution>
          <id>ant-verify</id>
          <phase>verify</phase>
          <goals>
            <goal>run</goal>
          </goals>
          <configuraction>
            <tasks>
              <echo>I'm bound to verify phase.</echo>
            </tasks>
          </configuraction>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
  • execution:執行任務
  • id : 執行任務的id
  • phase : 生命週期的特定階段
  • goal :插件目標
  • configuraction :插件任務的配置

在上述配置中,配置了兩個任務:ant-validate 和 ant-verify 。

ant-validate 將插件 maven-antrun-plugin 的 run 目標綁定到maven default生命週期的 validate階段上,同時配置了一個echo 任務,向命令行輸出一段文字。

4.獲取插件

當需要插件時,可以訪問如下網址獲取

https://maven.apache.org/plugins/

5.插件解析機制

Maven會區別對待依賴的遠程倉庫與插件的遠程倉庫:

  • 當Maven需要的依賴在本地倉庫不存在時,它會去所配置的遠程倉庫查找

  • 可是當Maven需要的插件在本地倉庫不存在時,它就不會去這些遠程倉庫查找。

不同於repositories及其repository子元素,插件的遠程倉庫使用pluginRepositories和pluginRepository配置。

默認的中央插件倉庫:

文件路徑:apache-maven-3.5.4/lib/maven-model-builder-3.5.4.jar!/org/apache/maven/model/pom-4.0.0.xml

  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

遠程插件倉庫的節點含義與遠程倉庫的節點含義相同。

發佈了18 篇原創文章 · 獲贊 4 · 訪問量 6134
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章