maven生命周期和插件详解
生命周期
什么是生命周期?
maven的生命周期就是对所有的构建过程进行抽象和统一。maven从大量项目和构建工具中总结了一套高度完善的、易扩展的生命周期。这个生命周期包含项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤。Maven的生命周期是抽象的,其实际行为都由插件来完成。Maven的生命周期是为了对所有的构建过程进行抽象和统一。
生命周期详解:
三套生命周期
Maven总共拥有三套相互独立的生命周期,分别为clean、default和site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,site目的是建立项目站点。每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。
clean生命周期:
- pre-clean 执行一些清理前需要完成的工作。
- clean 清理上一次构建生成的文件。
- post-clean 执行一些清理后需要完成的工作。
通过命令行调用pre-clean的时候,只有pre-clean阶段得以执行,当调用post-clean的时候,三个阶段会按顺序执行。
default生命周期:
default 包含的操作很多:
- 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生命周期
- pre-site
- site 生成项目站点文档。
- post-site
- site-deploy 将生成的项目站点发布到服务器上。
如何调用生命周期:
通过命令行调用maven的生命周期阶段。各个生命周期相互独立,而一个生命周期的阶段是有前后依赖关系的。例如:
mvn clean 该命令执行的阶段为clean生命周期的pre-clean和clean阶段。
mvn test 执行default生命周期的validate、initialize等,直到test的所有阶段。
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版本进行编译。
maven生命周期和插件详解的更多相关文章
- Maven系列第6篇:生命周期和插件详解,此篇看过之后在maven的理解上可以超越同级别90%的人!
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能. 这是maven系列第6篇. 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部 ...
- 05 Maven 生命周期和插件
Maven 生命周期和插件 除了坐标.依赖以及仓库之外, Maven 另外两个核心概念是生命周期和插件.在有关 Maven 的日常使用中,命令行的输入往往就对应了生命周期,如 mvn package ...
- maven生命周期和插件
maven生命周期和插件 生命周期 maven的生命周期有三套,互相独立.每个生命周期含有不同阶段,常用如下 clean 清理项目 pre-clean 执行清理前需要完成的工作 clean 清理上一次 ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- [maven] 生命周期和插件
maven生命周期和插件 生命周期 maven的生命周期有三套,互相独立.每个生命周期含有不同阶段,常用如下 clean 清理项目 pre-clean 执行清理前需要完成的工作 clean 清理上一次 ...
- MAVEN学习笔记之Maven生命周期和插件简介(3)
MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...
- Maven系列学习(三)Maven生命周期和插件
Maven生命周期和插件 Maven另外的两个核心概念就是生命周期和插件,Maven的生命周期都是抽象的,其实实际行为都是由插件来完成的,生命周期和插件两者协同工作 1.生命周期 Maven的生命周期 ...
- java多线程并发(二)--线程的生命周期及方法详解
上篇随笔介绍了线程的相关基础知识以及新启线程的几种方法,本片将继续介绍线程的生命周期及方法详解. 一.线程的生命周期 在Thread代码中,线程的状态被分为6种 public enum State { ...
- maven生命周期与插件
目录 Maven生命周期 clean default site 命令与对应周期 插件与绑定 插件目标 插件绑定 内置绑定 自定义绑定 插件配置 本文主要是针对<maven实战>书中关键知识 ...
随机推荐
- java三种注释以及参数涵义(转)
原文地址:https://www.cnblogs.com/miys/p/4bf714ce33068dcf9ac6526309c9b5e6.html 单行注释:// 注释内容 多行注释:/*... 注释 ...
- git误commit大文件导致不能push问题解决
git push时终端报错: error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Ent ...
- 【GO】【LiteIDE】
https://blog.csdn.net/qq_32034593/article/details/82986311 下载地址:https://www.golangtc.com/download/li ...
- Getting a handle on
Getting a handle on 丑闻处理 Corporate crises drive the media and politicians wild.But do they damage sh ...
- AT2412 最大の和
传送门 思路: 线段树暴力枚举区间,查询最大区间和. Code: #include<iostream> #include<cstdio> #include<algorit ...
- ubuntu使用抓包工具,charles
参考官网:https://www.charlesproxy.com/documentation/installation/apt-repository/ wget -q -O - https://ww ...
- 图片裁剪 cropper.js 上传组件封装 vue
//HTML cropper.js 文档地址: https://github.com/fengyuanchen/cropperjs/blob/master/README.md <template ...
- Autofac IOC框架
ASP.NET Core自带了一个轻量级的IOC容器 但是只提供了最基本的AddXXX方法来绑定实例关系 需要一个一个添加 可以使用其他IOC容器来替换内置的 ABP自带Castl ...
- linux基础16-bash编程(case语句及脚本选项 )
(1) case语句:选择结构 case SWITCH in value1) statement ... ;; //双分号结尾. value2) statement ... ;; *) stateme ...
- AutoField的话就报错:'AutoField' object has no attribute 'rel'
def data_inspect(self, data, extra=None): if isinstance(data, (QuerySet, Page, list)): convert_data ...