Maven系列 5.Maven生命週期

5.Maven生命週期
  目標和插件
  生成工件的構建過程通常需要幾個步驟和任務才能成功完成。這些任務的示例包括編譯源代碼,運行單元測試和打包工件。 Maven使用目標的概念來表示這樣的粒度任務。
  爲了更好地理解一個目標是什麼,讓我們看一個例子。清單5-1顯示了在c:\ apress \ gswm-book \ chapter5 \ gswm下的gswm項目代碼上執行的編譯目標。顧名思義,編譯目標編譯源代碼。編譯目標標識src / main / java下的Java類HelloWorld.java,編譯它,並將編譯的類文件放在target \ classes文件夾下。
  列表5-1。 maven編譯目標
      C:\apress\gswm-book\chapter5\gswm>mvn compiler:compile
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Getting Started with Maven 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------

[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-cli) @ gswm ---
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!
[INFO] Compiling 1 source file to C:\apress\gswm-book\chapter5\gswm\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.197s
[INFO] Finished at: Mon Oct 13 22:11:42 MDT 2014
[INFO] Final Memory: 7M/18M
[INFO] ------------------------------------------------------------------------
  Maven中的目標包裝在插件中,這些插件本質上是一個或多個目標的集合。在清單5-1中,編譯器是提供目標編譯的插件。清單5-2介紹了一個名爲clean的漂亮的目標。如前所述,目標文件夾保存Maven生成的臨時文件和工件。有時候目標文件夾變得龐大,或者某些已經緩存的文件需要從文件夾中清除。乾淨的目標完全實現了,因爲它試圖刪除目標文件夾及其所有內容。
  清單5-2。 Maven乾淨的目標
C:\apress\gswm-book\chapter5\gswm>mvn clean:clean
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Getting Started with Maven 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-cli) @ gswm ---
[INFO] Deleting C:\apress\gswm-book\chapter5\gswm\target
[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.233s
[INFO] Finished at: Mon Oct 13 22:14:49 MDT 2014
[INFO] Final Memory: 3M/15M
[INFO] ------------------------------------------------------------------------
  
  注意,清單5-2中的命令的clean:clean後綴。清除之前的冒號(:)代表乾淨的插件,清除跟隨冒號代表乾淨的目標。現在很明顯,在命令行中運行目標需要以下語法:
mvn plugin_identifier:goal_identifier
  可以使用pom.xml的插件部分配置插件及其行爲。考慮你想強制你的項目必須用Java 1.6編譯的情況。從3.0版本開始,Maven編譯器插件會根據Java 1.5編譯代碼。因此,您需要在pom.xml文件中修改此插件的行爲,如列表5-3所示。
  列表5-3。插件元素在pom.xml文件中
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
<modelVersion>4.0.0
</modelVersion>  
<!-- Project details omitted for brevity -->  
<dependencies>        
<!-- Dependency details omitted for brevity -->  
</dependencies>  
<build>

<plugins>    
<plugin>        
<groupId>org.apache.maven.plugins
</groupId>      
<artifactId>maven-compiler-plugin
</artifactId>      
<version>3.1
</version>      
<configuration>         
<source>1.6
</source>         
<target>1.6
</target>      
</configuration>    
</plugin>    
</plugins>  
</build>
</project>

    現在如果你要運行mvn編譯器:compile命令,生成的類文件將是Java版本1.6。

注意pom.xml中的<build />元素有一個非常有用的子元素,稱爲finalName。默認情況下,Maven生成的工件的名稱遵循<< project_artifiact_id >> - << project_version >>格式。但是,有時您可能需要更改生成的工件的名稱,而不更改artifactId。你可以通過聲明finalName元素爲<finalName> new_name </ finalName>來實現。
    生命週期和階段
  Maven在構建,測試和分發工件時遵循良好定義的構建生命週期。生命週期構成以相同順序執行的一系列階段或步驟,與產生的僞像無關。 Maven將生命週期中的步驟稱爲階段。 Maven有以下三個內置的生命週期: 
    默認值:此生命週期處理Maven項目的編譯,打包和部署。

清除:此生命週期處理從目標目錄刪除臨時文件和生成的工件。
    站點:這個生命週期處理文檔和站點生成的生成。   
    注意現在,您已經知道清潔生命週期,您只需通過使用命令mvn clean運行clean階段就可以清理目標文件夾。

  爲了更好地理解構建生命週期及其階段,讓我們來看看與默認生命週期相關的一些階段:
 
    驗證:運行檢查以確保項目正確,並且所有依賴項都已下載並可用。
    編譯:編譯源代碼。
    測試:使用框架運行單元測試。此步驟不需要打包應用程序。
    包:將編譯的代碼彙編爲可分發格式,例如JAR或WAR。
    安裝:將打包的歸檔安裝到本地存儲庫中。該歸檔現在可供在該機器上運行的任何項目使用。
    部署:將構建的存檔推送到遠程存儲庫,供其他團隊和團隊成員使用。
  因爲默認生命週期清楚地定義階段的順序,所以可以通過運行命令mvn package生成工件。 Maven將在所請求的階段之前自動執行所有階段。在提供的示例中,Maven將在運行包階段之前運行階段,如編譯和測試。這意味着開發人員和配置管理器只需要學習和使用少數命令。
  在每個階段需要執行許多任務。爲了實現這一點,每個階段都與一個或多個目標相關聯。階段簡單地將這些任務委派給它的相關目標。圖5-1顯示了生命週期,階段,目標和插件之間的關聯。

圖5-1。生命週期,階段,目標和插件之間的關聯
  pom.xml文件中的<packaged />元素將自動爲每個階段分配正確的目標,而無需任何其他配置。記住這是CoC的一個好處。如果包裝元素包含值jar,則包階段將綁定到jar插件中的jar目標。類似地,對於WAR工件,pom.xml將在war插件中將包綁定到war目標。
 
    跳過測試
    如前所述,當運行包階段時,測試階段也會運行,所有單元測試都會執行。如果測試階段有任何故障,構建將失敗。這是所需的行爲。但是,有時候,例如,當處理遺留項目時,您希望跳過運行測試,以便可以成功構建項目。你可以使用maven.test.skip屬性來實現。以下是使用此屬性的示例:
    mvn package -Dmaven.test.skip = true

  插件開發
  開發Maven的插件非常簡單。本節介紹如何開發一個例子HelloPlugin,它將給你一個插件開發的味道。
  如前所述,插件只是目標的集合。因此,當我們談論插件開發時,我們基本上是在談論開發目標。在Java中,這些目標使用MOJO實現,它代表Maven舊Java對象,類似於Java的普通舊Java對象(PO​​JO)。
  讓我們通過創建一個名爲gswm-plugin的Maven Java項目來開始這個插件開發,如圖5-2所示。我們正在C:\ apress \ gswm-book \ chapter5文件夾中啓動gswm-plugin項目下創建此項目。


圖5-2。 Maven項目的插件開發
    注意在本章中,我們手動創建插件項目。 Maven提供了一個mavan-archetype-mojo,它會啓動你的插件開發。我們將在第6章中學習Maven原型。
  pom.xml文件的內容如清單5-4所示。請注意,打包類型是maven-plugin。我們添加了maven-plugin-api依賴項,因爲它是插件開發所必需的。
  列表5-4。 pom.xml具有插件api依賴性

<?xml version="1.0" encoding="UTF-8"?>
<project>    
<modelVersion>4.0.0
</modelVersion>    
<groupId>com.apress.plugins
</groupId>    
<artifactId>gswm-plugin
</artifactId>    
<version>1.0.0
</version>    
<packaging>maven-plugin
</packaging>    
<name>Simple Hello Plugin
</name>    
<dependencies>        
<dependency> 
<groupId>org.apache.maven
</groupId>            
<artifactId>maven-plugin-api
</artifactId>            
<version>3.2.3
</version>        
</dependency>    
</dependencies>
</project>

  開發過程的下一步是創建MOJO。代碼5-5顯示了HelloMojo的代碼。正如你所看到的,實現是簡單的。我們使用Log實例將輸出記錄到控制檯。這個代碼的最重要的部分實際上是在Java註釋部分:@goal hello。使用Javadoc標籤@goal,我們將此目標的名稱聲明爲hello。還可以使用Java 5註釋,如@Mojo提供此元數據。但是,它需要在Apache Maven網站(http://maven.apache.org/plugin-tools/maven-plugin-plugin/examples/using-annotations.html)上討論的pom.xml文件更改。

  列表5-5。 HelloMojo Java類

package com.apress.plugins;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
/** * * @goal hello */public class HelloMojo extends AbstractMojo
{        public void execute() throws MojoExecutionException, MojoFailureException 
{                getLog().info("Hello Maven Plugin");
        
}
}
  此過程的最後一步是在Maven存儲庫中安裝插件。在目錄的根目錄下運行mvn install命令,你應該得到如代碼清單5-6所示的輸出。
  列表5-6。 Maven安裝命令
  C:\apress\gswm-book\chapter5\gswm-plugin>mvn install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Simple Hello Plugin 1.0.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-plugin-plugin:3.2:descriptor (default-descriptor) @ gswm-plugin ---
[INFO] Applying mojo extractor for language: java-annotations
[INFO] Mojo extractor for language: java-annotations found 0 mojo descriptors.
[INFO] Applying mojo extractor for language: java
[INFO] Mojo extractor for language: java found 1 mojo descriptors.
[INFO] Applying mojo extractor for language: bsh
[INFO] Mojo extractor for language: bsh found 0 mojo descriptors.
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ gswm-plugin ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\apress\gswm-book\chapter5\gswm-plugin\src\main\resources
[INFO]

[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ gswm-plugin -----------------------------------------------
[INFO] Building jar: C:\apress\gswm-book\chapter5\gswm-plugin\target\gswm-plugin-1.0.0.jar
[INFO]
[INFO] --- maven-plugin-plugin:3.2:addPluginArtifactMetadata (default-addPluginArtifactMetadata) @ gswm-plugin ---
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ gswm-plugin ---
[INFO] Installing C:\apress\gswm-book\chapter5\gswm-plugin\target\gswm-plugin-1.0.0.jar to C:\Users\<<USER_NAME>>\.m2\repository\com\apress\plugins\gswm-plugin\1.0.0\gswm-plugin-1.0.0.jar
[INFO] Installing C:\apress\gswm-book\chapter5\gswm-plugin\pom.xml to C:\Users\<<USER_NAME>>\.m2\repository\com\apress\plugins\gswm-plugin\1.0.0\gswm-plugin-1.0.0.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.788s
[INFO] Finished at: Mon Oct 13 22:29:55 MDT 2014
[INFO] Final Memory: 13M/32M
[INFO] ------------------------------------------------------------------------

  現在您可以開始使用此插件。請記住,運行任何目標的語法是mvn pluginId:goalId。代碼清單5-7顯示了這個插件在運行。請注意控制檯上的Hello Maven Plugin文本。
  列表5-7。運行Hello插件

C:\apress\gswm-book\chapter5\gswm-plugin>mvn com.apress.plugins:gswm-plugin:hello
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------------------------------------------
[INFO] Building Simple Hello Plugin 1.0.0
[INFO] ----------------------------------------------------------
[INFO] --- gswm-plugin:1.0.0:hello (default-cli) @ gswm-plugin ---
[INFO] Hello Maven Plugin
[INFO] ----------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ----------------------------------------------------------
[INFO] Total time: 0.583s
[INFO] Finished at: Mon Oct 13 22:32:55 MDT 2014
[INFO] Final Memory: 4M/15M
[INFO] ----------------------------------------------------------

總結

Maven使用基於插件的架構,使其功能可以輕鬆擴展。 每個插件是一個或多個目標的集合,可用於執行任務,如編譯源代碼或運行測試。 Maven將目標綁定到階段。 相通常作爲構建生命週期的一部分以序列執行。 您還學習了創建插件的基礎知識。
   在下一章中,您將介紹原型並瞭解多模塊項目。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章