Maven 5.Maven生命周期

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
[java] view plain  copy
 print ?
  1. [INFO] Scanning for projects...  
  2. [INFO]  
  3. [INFO] ------------------------------------------------------------------------  
  4. [INFO] Building Getting Started with Maven 1.0.0-SNAPSHOT  
  5. [INFO] ------------------------------------------------------------------------  
  6.   
  7. [INFO]  
  8. [INFO] --- maven-compiler-plugin:2.5.1:compile (default-cli) @ gswm ---  
  9. [WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!  
  10. [INFO] Compiling 1 source file to C:\apress\gswm-book\chapter5\gswm\target\classes  
  11. [INFO] ------------------------------------------------------------------------  
  12. [INFO] BUILD SUCCESS  
  13. [INFO] ------------------------------------------------------------------------  
  14. [INFO] Total time: 1.197s  
  15. [INFO] Finished at: Mon Oct 13 22:11:42 MDT 2014  
  16. [INFO] Final Memory: 7M/18M  
  17. [INFO] ------------------------------------------------------------------------  
  Maven中的目标包装在插件中,这些插件本质上是一个或多个目标的集合。在清单5-1中,编译器是提供目标编译的插件。清单5-2介绍了一个名为clean的漂亮的目标。如前所述,目标文件夹保存Maven生成的临时文件和工件。有时候目标文件夹变得庞大,或者某些已经缓存的文件需要从文件夹中清除。干净的目标完全实现了,因为它试图删除目标文件夹及其所有内容。
  清单5-2。 Maven干净的目标
[java] view plain  copy
 print ?
  1. C:\apress\gswm-book\chapter5\gswm>mvn clean:clean  
  2. [INFO] Scanning for projects...  
  3. [INFO]  
  4. [INFO] ------------------------------------------------------------------------  
  5. [INFO] Building Getting Started with Maven 1.0.0-SNAPSHOT  
  6. [INFO] ------------------------------------------------------------------------  
  7. [INFO]  
  8. [INFO] --- maven-clean-plugin:2.5:clean (default-cli) @ gswm ---  
  9. [INFO] Deleting C:\apress\gswm-book\chapter5\gswm\target  
  10. [INFO] ------------------------------------------------------------------------  
  11.   
  12. [INFO] BUILD SUCCESS  
  13. [INFO] ------------------------------------------------------------------------  
  14. [INFO] Total time: 0.233s  
  15. [INFO] Finished at: Mon Oct 13 22:14:49 MDT 2014  
  16. [INFO] Final Memory: 3M/15M  
  17. [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文件中
[java] view plain  copy
 print ?
  1. <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">    
  2. <modelVersion>4.0.0  
  3. </modelVersion>    
  4. <!-- Project details omitted for brevity -->    
  5. <dependencies>          
  6. <!-- Dependency details omitted for brevity -->    
  7. </dependencies>    
  8. <build>  
  9.   
  10. <plugins>      
  11. <plugin>          
  12. <groupId>org.apache.maven.plugins  
  13. </groupId>        
  14. <artifactId>maven-compiler-plugin  
  15. </artifactId>        
  16. <version>3.1  
  17. </version>        
  18. <configuration>           
  19. <source>1.6  
  20. </source>           
  21. <target>1.6  
  22. </target>        
  23. </configuration>      
  24. </plugin>      
  25. </plugins>    
  26. </build>  
  27. </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依赖性

[java] view plain  copy
 print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project>      
  3. <modelVersion>4.0.0  
  4. </modelVersion>      
  5. <groupId>com.apress.plugins  
  6. </groupId>      
  7. <artifactId>gswm-plugin  
  8. </artifactId>      
  9. <version>1.0.0  
  10. </version>      
  11. <packaging>maven-plugin  
  12. </packaging>      
  13. <name>Simple Hello Plugin  
  14. </name>      
  15. <dependencies>          
  16. <dependency>   
  17. <groupId>org.apache.maven  
  18. </groupId>              
  19. <artifactId>maven-plugin-api  
  20. </artifactId>              
  21. <version>3.2.3  
  22. </version>          
  23. </dependency>      
  24. </dependencies>  
  25. </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类

[java] view plain  copy
 print ?
  1. package com.apress.plugins;  
  2. import org.apache.maven.plugin.AbstractMojo;  
  3. import org.apache.maven.plugin.MojoExecutionException;  
  4. import org.apache.maven.plugin.MojoFailureException;  
  5. /** * * @goal hello */public class HelloMojo extends AbstractMojo  
  6. {        public void execute() throws MojoExecutionException, MojoFailureException   
  7. {                getLog().info("Hello Maven Plugin");  
  8.           
  9. }  
  10. }  
  此过程的最后一步是在Maven存储库中安装插件。在目录的根目录下运行mvn install命令,你应该得到如代码清单5-6所示的输出。
  列表5-6。 Maven安装命令
   C:\apress\gswm-book\chapter5\gswm-plugin>mvn install
[java] view plain  copy
 print ?
  1. [INFO] Scanning for projects...  
  2. [INFO]  
  3. [INFO] ------------------------------------------------------------------------  
  4. [INFO] Building Simple Hello Plugin 1.0.0  
  5. [INFO] ------------------------------------------------------------------------  
  6. [INFO]  
  7. [INFO] --- maven-plugin-plugin:3.2:descriptor (default-descriptor) @ gswm-plugin ---  
  8. [INFO] Applying mojo extractor for language: java-annotations  
  9. [INFO] Mojo extractor for language: java-annotations found 0 mojo descriptors.  
  10. [INFO] Applying mojo extractor for language: java  
  11. [INFO] Mojo extractor for language: java found 1 mojo descriptors.  
  12. [INFO] Applying mojo extractor for language: bsh  
  13. [INFO] Mojo extractor for language: bsh found 0 mojo descriptors.  
  14. [INFO]  
  15. [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ gswm-plugin ---  
  16. [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,i.e. build is platform dependent!  
  17. [INFO] skip non existing resourceDirectory C:\apress\gswm-book\chapter5\gswm-plugin\src\main\resources  
  18. [INFO]  
  19.   
  20. [INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ gswm-plugin -----------------------------------------------  
  21. [INFO] Building jar: C:\apress\gswm-book\chapter5\gswm-plugin\target\gswm-plugin-1.0.0.jar  
  22. [INFO]  
  23. [INFO] --- maven-plugin-plugin:3.2:addPluginArtifactMetadata (default-addPluginArtifactMetadata) @ gswm-plugin ---  
  24. [INFO]  
  25. [INFO] --- maven-install-plugin:2.4:install (default-install) @ gswm-plugin ---  
  26. [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  
  27. [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  
  28. [INFO] ------------------------------------------------------------------------  
  29. [INFO] BUILD SUCCESS  
  30. [INFO] ------------------------------------------------------------------------  
  31. [INFO] Total time: 2.788s  
  32. [INFO] Finished at: Mon Oct 13 22:29:55 MDT 2014  
  33. [INFO] Final Memory: 13M/32M  
  34. [INFO] ------------------------------------------------------------------------  

  现在您可以开始使用此插件。请记住,运行任何目标的语法是mvn pluginId:goalId。代码清单5-7显示了这个插件在运行。请注意控制台上的Hello Maven Plugin文本。
  列表5-7。运行Hello插件

[java] view plain  copy
 print ?
  1. C:\apress\gswm-book\chapter5\gswm-plugin>mvn com.apress.plugins:gswm-plugin:hello  
  2. [INFO] Scanning for projects...  
  3. [INFO]  
  4. [INFO] ----------------------------------------------------------  
  5. [INFO] Building Simple Hello Plugin 1.0.0  
  6. [INFO] ----------------------------------------------------------  
  7. [INFO] --- gswm-plugin:1.0.0:hello (default-cli) @ gswm-plugin ---  
  8. [INFO] Hello Maven Plugin  
  9. [INFO] ----------------------------------------------------------  
  10. [INFO] BUILD SUCCESS  
  11. [INFO] ----------------------------------------------------------  
  12. [INFO] Total time: 0.583s  
  13. [INFO] Finished at: Mon Oct 13 22:32:55 MDT 2014  
  14. [INFO] Final Memory: 4M/15M  
  15. [INFO] ----------------------------------------------------------  

总结

Maven使用基于插件的架构,使其功能可以轻松扩展。 每个插件是一个或多个目标的集合,可用于执行任务,如编译源代码或运行测试。 Maven将目标绑定到阶段。 相通常作为构建生命周期的一部分以序列执行。 您还学习了创建插件的基础知识。
   在下一章中,您将介绍原型并了解多模块项目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值