maven生命周期和插件
2017-12-09 11:42
309 查看
在有关Maven的日常使用中,命令行的输入往往就对应了生命周期,如mvn package就表示执行默认生命周期阶段package。Maven生命周期是抽象的,其实际行为都由插件来完成,如package阶段的任务可能就会有maven-jar-plugin完成。生命周期和插件两者协同工作,密不可分。
Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务(如编译源代码)都交由插件来完成。每个构件步骤都可以绑定一个或多个插件行为,而且Maven为大多数构件步骤编写并绑定了默认插件,如下图:
clean生命周期的目的是清理项目,包含阶段:
1 pre-clean 执行一些清理前需要完成的工作。
2 clean(绑定默认插件目标maven-clean-plugin:clean) 清理上一次构建生成的文件(target/目录)
3 post-clean 执行一些清理后需要完成的工作。
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/test/resources目录的内容进行变量替换等工作后,复制到项目输出的测试classpath目录中
generate-test-resources
process-test-resources
test-compile: 编译项目的测试代码,一般来说,是编译src/test/java目录下的Java文件至项目输出的测试classpath目录中
process-test-classes
test: 使用单元测试框架运行测试,测试代码不会打包或部署
prepare-package
package: 接受编译好的代码,打包成可发布的格式,如JAR
pre-integration-test
integration-test
post-integration-test
verify
install: 将包安装到Maven本地仓库,供本地其他Maven项目使用
deploy: 将最终的包复制到远程仓库,供其他开发人员和Maven项目使用
site生命周期: 建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成站点
pre-site: 执行一些在生成项目站点之前需要完成的工作
site: 生成项目站点文档
post-site: 执行一些在生成项目站点之后需要完成的工作
site-deploy: 将生成的项目站点发布到服务器上
每个生命周期包含了一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。当用户调用clean的时候,pre-clean 和 clean阶段会顺序执行,当用户调用clean时,per-clean、clean、post-clean会得到以此执行。
maven-dependency-plugin插件有十多个目标,每个目标对应一个功能,目标有:dependency:analyze、dependency:tree、dependency:list。这是一种通用写法,冒号前面是插件前缀,后面是插件目标。
clean生命周期阶段与插件目标的绑定关系
site生命周期阶段与插件目标的绑定关系
default生命周期与内置插件绑定关系及具体任务(打包类型: jar)
在pom.xml的根元素下添加以下内容:
mvn install -Dmaven.test.skip=true
1、何为生命周期
Maven的生命周期就是为了对所有的构件过程进行抽象和统一。Maven从大量项目和构件工具中学习和反思,然后总结了一套高度完善的、易扩展的生命周期。这个生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构件步骤。也就是说所有的项目构件都能映射到这样一个生命周期上。Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务(如编译源代码)都交由插件来完成。每个构件步骤都可以绑定一个或多个插件行为,而且Maven为大多数构件步骤编写并绑定了默认插件,如下图:
2、maven生命周期详解
2.1 三套生命周期
项目构建的生命周期一般包括:项目清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生成等阶段,但是maven为了更方便构建,maven使用了3套相互独立的生命周期来包含这些阶段,名称分别为:clean、default、site。clean生命周期的目的是清理项目,default生命周期目的是构建项目,site生命周期是建立项目站点。3套生命周期相互独立。每套生命周期中各个阶段都是由次序关系,后面阶段执行前必须先执行前面的阶段,就像人在死亡前他必须经历出生、少年、青年、壮年、老年这些阶段。每个生命周期都包含多个阶段,但是maven默认不是在所有阶段上都绑定了插件行为,只是在关键的周期阶段绑定了插件行为,没绑定插件行为的阶段在构建时就不会执行clean生命周期clean生命周期的目的是清理项目,包含阶段:
1 pre-clean 执行一些清理前需要完成的工作。
2 clean(绑定默认插件目标maven-clean-plugin:clean) 清理上一次构建生成的文件(target/目录)
3 post-clean 执行一些清理后需要完成的工作。
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/test/resources目录的内容进行变量替换等工作后,复制到项目输出的测试classpath目录中
generate-test-resources
process-test-resources
test-compile: 编译项目的测试代码,一般来说,是编译src/test/java目录下的Java文件至项目输出的测试classpath目录中
process-test-classes
test: 使用单元测试框架运行测试,测试代码不会打包或部署
prepare-package
package: 接受编译好的代码,打包成可发布的格式,如JAR
pre-integration-test
integration-test
post-integration-test
verify
install: 将包安装到Maven本地仓库,供本地其他Maven项目使用
deploy: 将最终的包复制到远程仓库,供其他开发人员和Maven项目使用
site生命周期: 建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成站点
pre-site: 执行一些在生成项目站点之前需要完成的工作
site: 生成项目站点文档
post-site: 执行一些在生成项目站点之后需要完成的工作
site-deploy: 将生成的项目站点发布到服务器上
每个生命周期包含了一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。当用户调用clean的时候,pre-clean 和 clean阶段会顺序执行,当用户调用clean时,per-clean、clean、post-clean会得到以此执行。
3、插件目标
Maven的核心仅仅定义了抽象生命周期,具体工作由插件完成,对于插件本身,为了能够实现代码复用,它往往能完成多个任务,也就具有多个功能,这些功能聚集在一个插件中,每个功能就叫做一个插件目标。maven-dependency-plugin插件有十多个目标,每个目标对应一个功能,目标有:dependency:analyze、dependency:tree、dependency:list。这是一种通用写法,冒号前面是插件前缀,后面是插件目标。
4、插件绑定
Maven的核心分发包只有不到3MB的大小,Maven会在需要的时候下载并使用插件,对于插件本身,为了能够复用代码,它往往能够完成多个任务。Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。4.1内置绑定
为了能够让用户几乎不用任何配置就能构件Maven项目,Maven在核心为一些主要的生命周期阶段绑定了很多插件目标,当用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务。clean生命周期阶段与插件目标的绑定关系
生命周期阶段 | 插件目标 |
---|---|
pre-clean | |
clean | maven-clean-plugin:clean |
post-clean |
生命周期阶段 | 插件目标 |
---|---|
pre-site | |
site | maven-site-plugin:site |
post-site | |
site-deploy | maven-site-plugin:deploy |
生命周期阶段 | 插件目标 | 执行任务 |
---|---|---|
process-resources | maven-resources-plugin:resources | 复制主资源文件至主输出目录 |
compile | maven-compile-plugin:compile | 编译主代码至主输出目录 |
process-test-resources | maven-resources-plugin:testRresources | 复制测试资源文件至测试输出目录 |
test-compile | maven-compiler-plugin:testCompile | 编译测试代码至测试输出目录 |
test | maven-surefire-plugin:test | 执行测试用例 |
package | maven-jar-plugin:jar | 创建项目jar包 |
install | maven-install-plugin:install | 将项目输出构件安装到本地仓库 |
deploy | maven-deploy-plugin:deploy | 将项目输出构件部署到远程仓库 |
4.2自定义绑定
假设把maven-source-plugin插件的jar-no-fork目标绑定到default的verify阶段。(jar-no-fork主要用来创建项目的源码jar包)在pom.xml的根元素下添加以下内容:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.1</version> <executions> <execution> <id>attach-sources</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> </plugins> </build>执行mvn命令mvn clean install,从控制台输出可以看到在插件maven-jar-plugin插件执行jar目标后,紧接着执行verify阶段的jar-no-fork目标:
[INFO] [INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ bus-location --- [INFO] Building jar: G:\bus-location\target\bus-location-1.0.jar [INFO] [INFO] --- maven-source-plugin:2.1.1:jar-no-fork (attach-sources) @ bus-location
5、插件配置
完成了插件和生命周期的绑定之后,用户还可以配置插件目标的参数,进一步调整插件目标所执行的任务,以满足项目的需求。几乎所有的Maven插件目标都有一些可配置的参数,用户可以通过命令行和POM配置等方式配置这些参数。5.1命令行插件配置
用户可以在Maven命令中使用-D参数,并伴随一个参数键=参数值的形式,来配置插件目标的参数。例如在maven-surefire-plugin提供了一个maven.test.skip参数,当其值为true时,就会跳过执行测试,于是在执行命令的时候,加上-D参数就能跳过测试:mvn install -Dmaven.test.skip=true
5.2POM中全局配置
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build>
相关文章推荐
- maven-生命周期与插件
- maven(7)生命周期和插件
- Maven:生命周期及插件
- (十二)Maven生命周期和插件
- Maven插件和生命周期
- Maven生命周期和插件
- 8、Maven的生命周期和插件
- MAVEN学习笔记之Maven生命周期和插件简介(3)
- Maven入门教程三----生命周期和插件
- maven生命周期与插件
- 一起学Maven(Maven中的生命周期与插件机制)<七>
- 【JavaWeb-28】Maven仓库、目录结构、命令和生命周期、添加jar包和插件
- Maven学习总结(16)——深入理解maven生命周期和插件
- maven的生命周期和插件
- Maven核心概念之仓库,生命周期与插件
- Maven的生命周期,阶段,插件,目标的关系
- 用AntRun插件测试Maven的生命周期
- 是goal还是phase?Maven插件(plugin)goal的执行与生命周期(lifecycle)phase的关系
- Maven实战——生命周期和插件
- Maven--生命周期和插件(四)