理解Maven生命周期和插件详情

       早在Maven出现之前,项目构建的生命周期就已经存在了,软件开发人员每天都对项目进行清理、编译、测试和部署。通过Maven更加方便管理项目的各个生命周期。Maven本质是一个插件框架,本身并不执行任何构建任务,所有的工作都是交给插件来完成的。熟练使用Maven插件,可以让我们的开发工作事半功倍

一、maven生命周期和插件关系

        生命周期和插件是Maven的两个核心概念,Maven的生命周期是抽象的,其实际行为都由插件来完成。Maven的生命周期是为了对所有的构建过程进行抽象和统一。Maven从大量的项目和构建工具中学习和反思,然后总结了一套高度完善、易拓展的生命周期。这个生命周期包括了清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。

       用户可以通过两种方式调用Maven插件目标。第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与 compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。第二种方式是直接在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。

每个生命周期中都包含着一系列的阶段(phase)。这些 phase 就相当于 Maven 提供的统一的接口,然后这些 phase 的实现由 Maven 的插件来完成。每个阶段(phase)会挂接一到多个goal。goal是maven里定义任务的最小单元。

lifecycle是总任务,phase就是总任务分出来的一个个子任务,但是这些子任务是被规格化的,它可以同时被多个lifecycle所包含,一个lifecycle可以包含任意个phase,phase的执行是按顺序的,一个phase可以绑定很多个goal,至少为一个,没有goal的phase是没有意义的

这是执行任务的最小单元,它可以绑定到任意个phase中,一个phase有一个或多个goal,goal也是按顺序执行的,一个phase被执行时,绑定到phase里的goal会按绑定的时间被顺序执行,不管phase己经绑定了多少个goal,你自己定义的goal都可以继续绑到phase中

我们在输入 mvn 命令的时候 比如 mvn clean,clean 对应的就是 Clean 生命周期中的 clean 阶段。但是 clean 的具体操作是 maven-clean-plugin 里面的clean goal 被执行。

二、maven生命周期

        Maven拥有三套相互独立的生命周期,他们分别是clean,default 和site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site生命周期的目的是建立项目站点。

  • clean生命周期
phase描述
pre-clean在实际项目清理之前执行所需的过程
clean删除上一个版本生成的所有文件
post-clean执行完成项目清理所需的过程
  • default生命周期的phase又可以分为:
phase描述
validate验证项目是否正确,并提供所有必要信息。
initialize初始化构建状态,例如设置属性或创建目录。
compile编译项目的源代
test使用合适的单元测试框架运行测试。这些测试不应要求打包或部署代码。
package获取已编译的代码并将其打包为可分发的格式,例如JAR。
verify运行任何检查以验证包是否有效并符合质量标准。
install将软件包安装到本地存储库中,以便在本地用作其他项目的依赖项。
deploy在集成或发布环境中完成,将最终包复制到远程存储库以与其他开发人员和项目共享。
  • site生命周期
phase描述
pre-site在实际项目站点生成之前执行所需的过程
site生成项目的站点文档
post-site执行完成站点生成所需的流程,并准备站点部署
site-deploy将生成的站点文档部署到指定的Web服务器

三、生命周期执行顺序

     从命令行执行maven任务的最主要方式就是调用maven的生命周期阶段。需要注意的是,各个生命周期是相互独立的,而一个生命周期的阶段是有前后依赖关系的。例子如下:
     1、$mvn clean :该命令调用clean生命周期的clean阶段。实际执行的阶段为clean生命周期的pre-clean和clean阶段。
     2、$mvn test:该命令调用default生命周期的test阶段。实际调用的是default生命周期的validate、initialize等,直到test的所有阶段。
     3、$mvn clean install:该命令调换用clean生命周期的clean阶段和default生命周期的instal阶段。

四、maven插件

clean插件maven-clean-plugin:2.5

       clean阶段是独立的一个阶段,功能就是清除工程目前下的target目录,对应的插件是 maven-clean-plugin:2.5,2.5是版本号,可以使用maven内置的插件,当然也可以自己在pom中配置

è¿éåå¾çæè¿°è¿éåå¾çæè¿°

resources插件maven-resources-plugin:2.6

resource插件的功能就是把项目需要的配置文件拷贝到指定的目当,默认是拷贝src\main\resources目录下的件到classes目录下,当然可以自己来配置源目录和输出目录。resources插件一般不单独执行,complie插件执行时会先调用resources插件。配置示例如下:

      <plugin>  
         <groupId>org.apache.maven.plugins</groupId>  
         <artifactId>maven-resources-plugin</artifactId>  
         <version>2.6</version>  
         <executions>  
           <execution>  
              <id>copy-resources</id>  
              <!-- 在default生命周期的 validate阶段就执行resources插件的copy-resources目标 -->  
              <phase>validate</phase>  
              <goals>  
                <goal>copy-resources</goal>  
              </goals>  
              <configuration>  
              <!-- 指定resources插件处理资源文件到哪个目录下 -->  
                 <outputDirectory>${project.build.outputDirectory}</outputDirectory>  
                  <!-- 也可以用下面这样的方式(指定相对url的方式指定outputDirectory) <outputDirectory>target/classes</outputDirectory> -->  
                  <!-- 待处理的资源定义 -->  
                  <resources>  
                     <resource>  
                        <!-- 指定resources插件处理哪个目录下的资源文件 -->  
                        <directory>src/main/${deploy.env}/applicationContext.xml</directory>  
                        <!-- 指定不需要处理的资源 <excludes> <exclude>WEB-INF/*.*</exclude> </excludes> -->  
                        <!-- 是否对待处理的资源开启过滤模式 (resources插件的copy-resources目标也有资源过滤的功能,这里配置的   
                        这个功能的效果跟<build><resources><resource>下配置的资源过滤是一样的,只不过可能执行的阶段不一样, 这里执行的阶段是插件指定的validate阶段,<build><resources><resource>下的配置将是在resources插件的resources目标执行时起作用(在process-resources阶段)) -->  
                        <filtering>false</filtering>  
                     </resource>  
                  </resources>  
              </configuration>  
              <inherited></inherited>  
           </execution>  
         </executions>  
  
         </plugin>  

compile插件maven-compiler-plugin

compile插件执行时先调用resouces插件,功能就是把src\mainjava源码编译成字节码生成class文件,并把编译好的class文件输出到target\classes目录下。下面看执行结果:

è¿éåå¾çæè¿°

 è¿éåå¾çæè¿°

 单元测试所用插件surefire-maven-plugin

单元测试所用的compile和resources插件和主代码是相同的,但执行的目标不行,目标testCompile和testResources是把src\test\java下的代码编译成字节码输出到target\test-classes,同时把src\test\resources下的配置文件拷贝到target\test-classes。看下面的输出:
è¿éåå¾çæè¿°

 插件maven-surefire-plugin:2.12.4是执行单元测试类的,如果单测试不通行,构建会失败,在编译正式的项目时可以使用mvn -Dmaven.test.skip=true 来跳过测试类的编译和运行过程。mvn test可以单独执行,但是这个命令其实是包括了resources、compile、testResources、testCompile、test这几个阶段如上面所说。

 

发布插件maven-install-plugin

发布插件的功能就是把构建好的artifact部署到本地仓库,还有一个deploy插件是将构建好的artifact部署到远程仓库。

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值