Maven百科 - 项目构建中的生命周期与插件管理

Road Map

1 Maven 中的三套生命周期

    在maven中,实际上是有三套相互独立的生命周期(Lifecycle),而不是咱们觉得的一套生命周期,准确地来讲,在maven的世界,它有本身的一套生命周期管理的技术体系,在这套体系中,maven为咱们定义了三套互相不影响的生命周期。它们分别是clean,default和site。 其中clean 和default最为经常使用了。java

     此外呢,每套生命周期 都有若干个生命周期阶段(phase)。其中每套生命周期中的阶段都依赖于前一个阶段,以 clean 生命周期为例。 clean 生命周期 它包含了 三个阶段,pre-clean, clean, post-clean.    Clean 依赖与pre-clean, post-clean依赖与clean,也就是说,当咱们执行clean 阶段的时候, pre-clean 也会被执行。apache

    下面会详细介绍下三套生命周期服务器

1.1 Clean 生命周期

    clean 生命周期的目的是情理项目,它包含了三个阶段:并发

  1.      pre-clean 执行一次清理前须要完成的工做maven

  2.      clean 执行清理工做post

  3.      post-clean 执行一些清理后要完成的工做测试

1.2 Default 生命周期

    default 生命周期定义了真正构建时所须要执行的全部的步骤,它是全部生命周期中最核心的部分,它包括以下的阶段ui

生命周期阶段 描述
validate 验证项目是否正确,以及全部为了完整构建必要的信息。
initialize  
generate-sources 生成全部须要包含在编译过程当中的源代码
process-sources 处理源代码
generate-resources 生成所须要的包含在打包过程当中的资源文件
process-resources 处理项目主资源文件。通常来讲,是对src/main/resources目录的内容进行变量替换等工做后,复制到项目输出的主classpath目录中
compile 编译项目的主源码。通常来讲,是编译src/main/java目录下的Java文件至项目输出的主classpath目录中
 process-classes 处理编译生成的文件 如.class文件
generate-test-sources

生成全部包含在测试编译过程当中的测试源码spa

process-test-sources

处理测试源码插件

generate-test-resources

生成厕所须要的资源文件

process-test-resources

复制并处理测试次元文件到测试目标目录

test-compile

编译测试代码

process-test-classes

处理 编译测试文件

test

执行测试

prepare-package

在真正打包以前,执行一些准备打包的必要操做

package

将编译好的代码打包成须要的格式

pre-integration-test

执行一些在集成测试前的须要动做

integration-test

处理包并发布到集成测试环境

post-integration-test

执行一些在集成测试运行以后须要的动做

verify

执行全部检查,验证包是否有效

 install

安装包至本地仓库

 deploy

复制包到远程仓库,共享给其余开发人员和项目

    

 

1.3 Site 生命周期

    Site 生命周期的目的是创建和发布项目站点,Maven 可以基于 POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布信息。它包含了以下4个阶段

  1.     pre-site 执行项目生成前的工做

  2.     site 生成项目站点文档

  3.     post-site 执行生成站点后的工做

  4.     site-deploy 将生成的项目站点发布到服务器上

1.4 命令行与生命周期

    从maven的命令行中,能够看出 执行maven 任务最主要的方式 就是调用maven的生命周期阶段。须要注意的是,这三套生命周期,是相互独立的,只有在同一个生命周期里面的阶段 具备依赖关系。

    以 mvn test 为例,该命令调用defaul生命周期的test阶段。实际执行的阶段为default生命周期的 validate,initialize等

直到test的全部阶段。这也解释了在执行测试的时候,项目源代码也会获得编译。

 

2 插件管理

2.1 插件目标(plugin goal)

     Maven 定义了抽象的生命周期,具体的任务是由插件完成的,插件以独立的构件形式存在,所以,Maven自己并不大,在实际应用中会下载不少插件。

    插件自己而言,为了可以复用代码,每每可以完成多个任务。因此针对每一个任务单独写一个插件,显得过于浪费,或者使得插件库过于庞大,所以maven就将每一个功能设定成目标。

    如 maven-dependency-plugin有十几个目标,每一个目标对应一个功能。

mvn dependency:analyze
mvn dependency:tree
mvn dependency:list

2.2 插件绑定

    Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言,生命周期的阶段与插件的目标相互绑定,完成某个具体的构建任务。

2.3 内置绑定

    Maven 默认给生命周期的各阶段绑定了内置的一些插件目标,方便用户。当经过maven命令执行生命周期的时候,会找到对应的绑定的插件目标,完成相应的任务

生命周期阶段 插件
pre-clean maven-clean-plugin:clean
clean maven-clean-plugin:clean
post-clean maven-clean-plugin:clean
process-resources maven-resources-plugin:resources
compile maven-compiler-plugin:compile
process-test-resources

maven-resources-plugin:testResources

test-compile

maven-compiler-plugin:testCompile

test

maven-surefire-plugin:test

package

maven-jar-plugin:jar

 install

maven-deploy-plugin:install

 deploy

maven-deploy-plugin:deploy

pre-site maven-site-plugin:site
site maven-site-plugin:site
post-site maven-site-plugin:site
site-deploy maven-site-plugin:deploy

2.4 自定义绑定

除了内置绑定之外,用户还可以选择将某个插件目标绑定到生命周期的某个阶段上

<build>
    <plugins>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-source-plugin</artifactId>
             <version>2.1.1></version>
             <execution>
                 <id>attach-sources</id>
                 <phase>verify</phase>
                 <goals>
                      <goal>jar-no-fork</goal>
                 </goals>
              </execution>
          </plugin>
     </plugins>
</build>

2.5 插件配置

    插件不是固定执行,能够经过传递一些参数,进一步调正任务执行

2.5.1 命令行插件配置

在命令行执行任务的时候能够经过 -D参数 并伴随一个键值对,来配置插件目标参数

mvn install -Dmaven.test.skip=true

2.5.2 POM插件全局配置

     并非全部插件的参数 都适合在命令行配置,MAVEN提供了在pom配置文件里面配置全局的配置.

    在pom里面生命插件的时候 能够在节点 <configuration>下面配置对应的参数

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

2.5.3 POM插件任务配置

针对任务目标的配置也是能够的

<build>
    <plugins>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-source-plugin</artifactId>
             <version>2.1.1></version>
             <execution>
                 <id>attach-sources</id>
                 <phase>verify</phase>
                 <goals>
                      <goal>jar-no-fork</goal>
                 </goals>
                 <configuration>
                     <tasks>
                         <echo>I'm jar-no-fork</echo>
                     </tasks>
                 </configuration>
              </execution>
          </plugin>
     </plugins>
</build>
相关文章
相关标签/搜索