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文件中
  
4.0.0
  
  
        
  
  


    
        
org.apache.maven.plugins
      
maven-compiler-plugin
      
3.1
      
         
1.6
         
1.6
      
    
    
  


    现在如果你要运行mvn编译器:compile命令,生成的类文件将是Java版本1.6。

注意pom.xml中的元素有一个非常有用的子元素,称为finalName。默认情况下,Maven生成的工件的名称遵循<< project_artifiact_id >> - << project_version >>格式。但是,有时您可能需要更改生成的工件的名称,而不更改artifactId。你可以通过声明finalName元素为 new_name 来实现。
    生命周期和阶段
  Maven在构建,测试和分发工件时遵循良好定义的构建生命周期。生命周期构成以相同顺序执行的一系列阶段或步骤,与产生的伪像无关。 Maven将生命周期中的步骤称为阶段。 Maven有以下三个内置的生命周期: 
    默认值:此生命周期处理Maven项目的编译,打包和部署。

清除:此生命周期处理从目标目录删除临时文件和生成的工件。
    站点:这个生命周期处理文档和站点生成的生成。   
    注意现在,您已经知道清洁生命周期,您只需通过使用命令mvn clean运行clean阶段就可以清理目标文件夹。

  为了更好地理解构建生命周期及其阶段,让我们来看看与默认生命周期相关的一些阶段:
 
    验证:运行检查以确保项目正确,并且所有依赖项都已下载并可用。
    编译:编译源代码。
    测试:使用框架运行单元测试。此步骤不需要打包应用程序。
    包:将编译的代码汇编为可分发格式,例如JAR或WAR。
    安装:将打包的归档安装到本地存储库中。该归档现在可供在该机器上运行的任何项目使用。
    部署:将构建的存档推送到远程存储库,供其他团队和团队成员使用。
  因为默认生命周期清楚地定义阶段的顺序,所以可以通过运行命令mvn package生成工件。 Maven将在所请求的阶段之前自动执行所有阶段。在提供的示例中,Maven将在运行包阶段之前运行阶段,如编译和测试。这意味着开发人员和配置管理器只需要学习和使用少数命令。
  在每个阶段需要执行许多任务。为了实现这一点,每个阶段都与一个或多个目标相关联。阶段简单地将这些任务委派给它的相关目标。图5-1显示了生命周期,阶段,目标和插件之间的关联。

图5-1。生命周期,阶段,目标和插件之间的关联
  pom.xml文件中的元素将自动为每个阶段分配正确的目标,而无需任何其他配置。记住这是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依赖性


    
4.0.0
    
com.apress.plugins
    
gswm-plugin
    
1.0.0
    
maven-plugin
    
Simple Hello Plugin
    
        
 
org.apache.maven
            
maven-plugin-api
            
3.2.3
        
    


  开发过程的下一步是创建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\<>\.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\<>\.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将目标绑定到阶段。 相通常作为构建生命周期的一部分以序列执行。 您还学习了创建插件的基础知识。
   在下一章中,您将介绍原型并了解多模块项目。

你可能感兴趣的:(Maven,Gradle,Android)