maven生命周期和插件详解

生命周期

什么是生命周期? 

  maven的生命周期就是对全部的构建过程进行抽象和统一。maven从大量项目和构建工具中总结了一套高度完善的、易扩展的生命周期。这个生命周期包含项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎全部的构建步骤。Maven的生命周期是抽象的,其实际行为都由插件来完成。Maven的生命周期是为了对全部的构建过程进行抽象和统一。java

生命周期详解:

三套生命周期

    Maven总共拥有三套相互独立的生命周期,分别为clean、default和site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,site目的是创建项目站点。每一个生命周期包含一些阶段(phase),这些阶段是有顺序的,而且后面的阶段依赖于前面的阶段。react

clean生命周期git

  • pre-clean 执行一些清理前须要完成的工做。
  • clean 清理上一次构建生成的文件。
  • post-clean 执行一些清理后须要完成的工做。

经过命令行调用pre-clean的时候,只有pre-clean阶段得以执行,当调用post-clean的时候,三个阶段会按顺序执行。github

 

default生命周期:web

default 包含的操做不少:spring

  • validate
  • initialize
  • generate-sources
  • process-sources 处理项目主资源文件。通常来讲,是对src/main/resources目录的内容进行变量替换等工做后,复制到项目输出的主classpath目录中。
  • generate-resources
  • process-resources
  • compile 编译项目的主代码。通常来讲,是编译src/main/java目录下的Java文件至项目输出的主classpath目录中。
  • process-classes
  • generate-test-sources
  • process-test-sources 处理项目测试资源文件 src/main/resources。
  • generate-test-resources
  • test-compile 编译项目的测试代码。src/test/java。
  • process-test-classes
  • test 使用单元测试框架运行测试,测试代码不会被打包或部署。
  • prepare-package
  • package 接受编译好的代码,打包成可发布的格式,如jar。
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install 将包安装到Maven本地仓库,供本地其余Maven项目使用。
  • deploy 将最终的包复制到远程仓库。

 

site生命周期apache

  • pre-site
  • site 生成项目站点文档。
  • post-site 
  • site-deploy 将生成的项目站点发布到服务器上。

 

如何调用生命周期:

经过命令行调用maven的生命周期阶段。各个生命周期相互独立,而一个生命周期的阶段是有先后依赖关系的。例如:json

 mvn clean 该命令执行的阶段为clean生命周期的pre-clean和clean阶段。服务器

 mvn test 执行default生命周期的validate、initialize等,直到test的全部阶段。mybatis

 mvn clean install 执行clean的pre-clean、clean,default的从validate到install的全部阶段。

 

插件

插件目标(Plugin Goal):

    一个插件每每可以完成多个任务。例如maven-dependency-plugin,它可以基于项目依赖作不少事情,例如分析项目依赖,帮助找出全部已解析的依赖等等,每一个功能就是一个插件目标。用法是 <插件前缀:目标>。例如maven-dependency-plugin有十多个目标,最经常使用的:

mvn dependency:analyze

//执行结果:
[WARNING] Used undeclared dependencies found:
[WARNING]    org.springframework:spring-web:jar:5.0.4.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot-autoconfigure:jar:2.0.0.RELEASE:compile
[WARNING]    org.springframework:spring-tx:jar:5.0.4.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot:jar:2.0.0.RELEASE:compile
[WARNING] Unused declared dependencies found:
[WARNING]    com.alibaba:fastjson:jar:1.2.31:compile
[WARNING]    org.springframework.boot:spring-boot-starter-test:jar:2.0.0.RELEASE:test
[WARNING]    org.springframework.boot:spring-boot-starter-web:jar:2.0.0.RELEASE:compile
[WARNING]    org.mybatis.spring.boot:mybatis-spring-boot-starter:jar:1.3.0:compile
[WARNING]    com.google.guava:guava:jar:23.0:compile

Unused declared dependencies found即声明了没使用的依赖,经过这个插件,就能看到项目依赖的状况。若是是由于继承了父pom文件而致使无用依赖太多,那么可使用dependencyManagement管理。 

 

插件绑定:

    Maven的生命周期与插件相互绑定,用以完成实际的构建任务。例如项目编译这一任务,它对应了default生命周期的compile阶段,而maven-compile-plugin这一插件的compile目标能完成该任务。所以,将它们绑定,就能实现编译的目的。

 

内置绑定: 

  Maven在核心为一些主要的生命周期阶段绑定了不少插件的目标,当用户经过命令行调用生命周期阶段的时候,对于的插件目标就会执行相应的任务。例如clean绑定maven-clean-plugin:clean。

  而default生命周期,因为项目的打包类型会影响构建的具体过程,所以,default生命周期的阶段与插件的目标绑定关系由项目打包类型所决定,经过POM中的packaging元素定义。最经常使用的打包类型是jar。如下是基于jar,default生命周期的内置插件绑定关系:

default生命周期还有不少其余阶段,默认它们没有绑定任何插件,所以也没有实际行为。

咱们经过maven命令行的输出能够看到项目构建过程执行了那些插件目标,例如,执行 mvn clean install 命令,能够看到以下输出:

~/Desktop/github/reactive-demo/reactor(master*) » mvn clean install                                               yrw@Mac
[INFO] Scanning for projects...
[INFO] 
[INFO] --------------------< com.vgrazi.reactive:reactor >---------------------
[INFO] Building reactor 1.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ reactor ---
[INFO] Deleting /Users/yrw/Desktop/github/reactive-demo/reactor/target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ reactor ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/yrw/Desktop/github/reactive-demo/reactor/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ reactor ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 6 source files to /Users/yrw/Desktop/github/reactive-demo/reactor/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ reactor ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/yrw/Desktop/github/reactive-demo/reactor/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ reactor ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/yrw/Desktop/github/reactive-demo/reactor/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ reactor ---
[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ reactor ---
[INFO] Building jar: /Users/yrw/Desktop/github/reactive-demo/reactor/target/reactor-1.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ reactor ---
[INFO] Installing /Users/yrw/Desktop/github/reactive-demo/reactor/target/reactor-1.0.1-SNAPSHOT.jar to /Users/yrw/.m2/repository/com/vgrazi/reactive/reactor/1.0.1-SNAPSHOT/reactor-1.0.1-SNAPSHOT.jar
[INFO] Installing /Users/yrw/Desktop/github/reactive-demo/reactor/pom.xml to /Users/yrw/.m2/repository/com/vgrazi/reactive/reactor/1.0.1-SNAPSHOT/reactor-1.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.175 s
[INFO] Finished at: 2018-12-02T19:48:46+08:00
[INFO] ------------------------------------------------------------------------

经过以上日志输出,能够看到,执行的插件目标依次为:

maven-clean-plugin:clean

maven-resources-plugin:resources

maven-compile-plugin:compile

maven-resource-plugin:testResources

maven-compile-plugin:testConpile

maven-surefile-plugin:test

maven-jar-plugin:jar

maven-install-plugin:install

 

自定义绑定:

  除了内置绑定之外,用户还可以本身选择将某个插件目标绑定到生命周期的某个阶段上。例如一个经常使用的插件 Maven Archetype Plugin,用户经过这个插件能够生成一个Maven项目的骨架,也能够从一个现成的项目中生成模板。

一般的用法是使用 mvn archetype:create-from-project 指令生成模板。若是我正在编写一个模板项目,我但愿在打包的时候自动生成模板,那么我能够把这个目标绑定到default的package生命周期上,以下配置:

</plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-archetype-plugin</artifactId>
    <version>3.0.1</version>
      <executions>
        <execution>
          <id>create-archetype</id>
          <phase>package</phase>
          <goals>
            <goal>create-from-project</goal>
          </goals>
        </execution>
     </executions>
    </plugin>
</plugins>

  在POM的build元素下的plugins子元素中声明插件的使用,除了配置插件的坐标声明外,还有插件的执行配置,executeions下每一个execution子元素能够用来配置执行一个任务。咱们配置了一个id为create-archetype的任务,经过phrase配置,将其绑定到package生命周期阶段上,再经过goals配置指定要执行的插件目标。

执行 mvn clean package 就能看到有如下输出:

//......以上省略......

[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ demo ---
[INFO] Building jar: /Users/yrw/Desktop/github/demo/target/demo-1.0-SNAPSHOT.jar
[INFO] 
[INFO] >>> maven-archetype-plugin:3.0.1:create-from-project (create-archetype) > generate-sources @ demo >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:3.0.1:create-from-project (create-archetype) < generate-sources @ demo <<<
[INFO] 
[INFO] 
[INFO] --- maven-archetype-plugin:3.0.1:create-from-project (create-archetype) @ demo ---
[INFO] Setting default groupId: com.yrw
[INFO] Setting default artifactId: demo
[INFO] Setting default version: 1.0-SNAPSHOT
[INFO] Setting default package: com.yrw.test
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------< com.yrw:demo-archetype >-----------------------
[INFO] Building demo-archetype 1.0-SNAPSHOT
[INFO] --------------------------[ maven-archetype ]---------------------------
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ demo-archetype ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 84 resources
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ demo-archetype ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 2 resources
[INFO] 
[INFO] --- maven-archetype-plugin:3.0.1:jar (default-jar) @ demo-archetype ---
[INFO] Building archetype jar: /Users/yrw/Desktop/github/demo/target/generated-sources/archetype/target/demo-archetype-1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.110 s
[INFO] Finished at: 2018-11-23T22:12:15+08:00
[INFO] ------------------------------------------------------------------------
[INFO] Archetype project created in /Users/yrw/Desktop/github/demo/target/generated-sources/archetype
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.689 s
[INFO] Finished at: 2018-11-23T22:12:15+08:00
[INFO] ------------------------------------------------------------------------

能够看到,在打包的时候执行了archetype:create-from-project,进入/target/generated-sources/archetype目录,就能看到生成的模板了。

 

插件配置 

命令行配置插件:

    插件目标支持命令行配置,能够经过-D参数,并伴随一个参数=参数值的形式,来配置插件目标的参数。例如命令 mvn install -Dmaven.test.skip=true ,就会跳过执行测试。

 

在pom中配置全局插件:

  并非全部的插件参数都适合从命令行配置,有些参数的值从项目发布都不会改变,对于这种状况,能够在pom文件中一次性配置。例如须要配置maven-compiler-plugin编译java1.8.

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

这样,无论绑定到compile阶段的maven-compiler-plugin:compile任务,仍是绑定到test-compiler阶段的maven-compiler-plugin:testCompiler任务,就都可以使用该配置,基于1.8版本进行编译。

相关文章
相关标签/搜索