maven的生命周期
maven的生命周期
一、三套生命周期
maven有3套生命周期,分别是Clean生命周期(Clean Lifecycle),Default生命周期(Default Lifecycle),Site生命周期(Site Lifecycle)。三套生命周期是互相独立的,每种生命周期的阶段是前后依赖的。执行某个阶段,则会先依次执行该生命周期的前面阶段。
1.Clean生命周期(Clean Lifecycle)
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。当我们执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段:
- pre-clean 执行一些需要在clean之前完成的工作
- clean 移除所有上一次构建生成的文件 (绑定默认插件目标maven-clean-plugin:clean)清理上一次构建生成的文件(target/目录)
- post-clean 执行一些需要在clean之后立刻完成的工作
mvn clean 中的 clean 就是上面的 clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,如果执行 mvn clean 将运行以下两个生命周期阶段:
pre-clean, clean
如果我们运行 mvn post-clean ,则运行以下三个生命周期阶段:
pre-clean, clean, post-clean
2.Default生命周期(Default Lifecycle)
Default Lifecycle是构建的核心部分,编译,测试,打包,部署等等,Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。
生命周期阶段 | 描述 |
---|---|
validate(校验) | 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 |
initialize(初始化) | 初始化构建状态,比如设置属性值。 |
generate-sources(生成源代码) | 生成包含在编译阶段中的任何源代码。 |
process-sources(处理源代码) | 处理源代码,比如说,过滤任意值。 |
generate-resources(生成资源文件) | 生成将会包含在项目包中的资源文件。 |
process-resources (处理资源文件) | 复制和处理资源到目标目录,为打包阶段最好准备。 |
compile(编译) | 编译项目的源代码。 |
process-classes(处理类文件) | 处理编译生成的文件,比如说对Java class文件做字节码改善优化。 |
generate-test-sources(生成测试源代码) | 生成包含在编译阶段中的任何测试源代码。 |
process-test-sources(处理测试源代码) | 处理测试源代码,比如说,过滤任意值。 |
generate-test-resources(生成测试资源文件) | 为测试创建资源文件。 |
process-test-resources(处理测试资源文件) | 复制和处理测试资源到目标目录。 |
test-compile(编译测试源码) | 编译测试源代码到测试目标目录. |
process-test-classes(处理测试类文件) | 处理测试源码编译生成的文件。 |
test(测试) | 使用合适的单元测试框架运行测试(Juint是其中之一)。 |
prepare-package(准备打包) | 在实际打包之前,执行任何的必要的操作为打包做准备。 |
package(打包) | 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 |
pre-integration-test(集成测试前) | 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。 |
integration-test(集成测试) | 处理和部署项目到可以运行集成测试环境中。 |
post-integration-test(集成测试后) | 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。 |
verify (验证) | 运行任意的检查来验证项目包有效且达到质量标准。 |
install(安装) | 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 |
deploy(部署) | 将最终的项目包复制到远程仓库中与其他开发者和项目共享。 |
些比较重要和常用的阶段:
- process-resources 复制并处理资源文件,至目标目录,准备打包(绑定默认插件目标maven-resources-plugin:resources)处理项目主资源文件,一般来说,是对src/main/resources目录的内容进行变量替换等工作后,然后复制到项目输出的主classpath目录中。
- compile 编译项目的源代码 (绑定默认插件目标maven-compiler-plugin:compile)编译项目的主源码,编译src/main/java目录下的Java文件至项目输出的主classpath目录中。
- process-test-resources 复制并处理资源文件,至目标测试目录(绑定默认插件目标maven-resources-plugin:testResources)处理项目测试资源文件,一般来说,是对src/test/resources目录的内容进行变量替换等工作后,然后复制到项目输出的测试classpath目录中。
- test-compile 编译测试源代码(绑定默认插件目标maven-compiler-plugin:testCompile)编译项目的测试代码。一般来说,是编译src/test/java目录下的Java文件至项目输出的测试classpath目录中
- test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署(绑定默认插件目标maven-surefire-plugin:test)使用单元测试框架运行测试,测试代码不会被打包部署。
- package 接受编译好的代码,打包成可发布的格式,如 JAR(绑定默认插件目标maven-jar-plugin:jar)接受编译好的代码,打包成可发布的格式,如JAR
- install 将包安装至本地仓库,以让其它项目依赖。(绑定默认插件目标maven-install-plugin:install)将包安装到Maven仓库,供本地项目使用
- deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享(绑定默认插件目标maven-deploy-plugin:deploy)将最终的包复制到远程仓库,供其他开发人员和maven项目使用。
3.Site生命周期(Site Lifecycle)
Site Lifecycle 生成项目报告,站点,发布站点,站点的文档(站点信息,依赖..)。Site生命周期,生成站点信息四个阶段:
- pre-site:执行一些需要在生成站点文档之前完成的工作
- site:生成项目的站点文档 (绑定默认插件目标maven-site-plugin:site)
- post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上(绑定默认插件目标maven-site-plugin:deploy)
4.命令行与生命周期
mvn clean 仅执行clean生命周期的pre-clean和clean阶段
mvn test 执行default生命周期的validate、compile、test阶段
mvn clean package 执行clean生命周期的pre-clean和clean阶段以及default生命周期的validate、compile、test、package阶段
mvn clean install 执行clean生命周期的pre-clean和clean阶段以及default生命周期的validate、compile、test、package、 install阶段
mvn clean deploy 执行clean生命周期的pre-clean和clean阶段以及default生命周期的validate、compile、test、 install、 deploy阶段
mvn clean install site-deploy 执行三种生命周期
二、插件
1.插件目标
maven中插件是以构件的形式存在。一个插件能完成好几个功能,每个功能对应插件的一个目标。
- Maven的核心仅仅定义了抽象生命周期,具体工作由插件完成,对于插件本身,为了能够实现代码复用,它往往能完成多个任务,也就具有多个功能,这些功能聚集在一个插件中,每个功能就叫做一个插件目标。
- maven-dependency-plugin插件有十多个目标,每个目标对应一个功能,目标有:dependency:analyze、dependency:tree、dependency:list。这是一种通用写法,冒号前面是插件前缀,后面是插件目标。
2.插件绑定
我们把插件的目标绑定到maven生命周期的某个阶段用于完成实际任务,叫做插件绑定。例如:maven-compiler-plugin这一插件的compile目标能够完成项目编译这一任务,因此就把该目标绑定到default生命周期的compile这一阶段。
a.maven内置绑定插件
- Maven在核心的生命周期阶段绑定了很多插件的目标,当用户通过命令调用生命周期阶段的时候对应的插件目标就会执行相应的任务。
- 对于默认的插件绑定在上面介绍3个生命周期时已经有备注了,下面对default生命周期的内置插件绑定关系做一些说明。
- default生命周期与插件的绑定关系由打包类型决定packaging,因为jar项目需要打包成JAR包,war项目需要打包成war包,还有pom、maven-plugin、ear等类型.
b.自定义绑定
用户可以自己配置某个插件的某个目标绑定生命周期的某个阶段,让maven在构建项目时执行更多富有特色的任务。比如创建项目的源码jar包,内置插件没有涉及这一任务。maven-source-plugin插件的jar-no-fork目标能够将项目的主代码打包成jar文件,可以将该目标绑定到default生命周期的verify阶段上,即在执行完成测试后和安装构件之前创建源码jar包。
<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>
解释
- groupId为org.apache.maven.plugins(maven官方插件),凡是gourpId为org.apache.maven.plugins可以省略(不推荐).
- executions下每个execution元素可以用来配置执行一个任务,该例中配置一个id为my-attach-sources的任务。
- 通过phase将其绑定到verify生命周期阶段上。不配置phase也会执行目标(不推荐),因为该插件编写时默认阶段是package,而package在install之前.
- 通过goals配置指定要执行的插件目标。
- 多个目标被绑定到同一目标上时,执行顺序安装声明先后执行。
3.插件配置
- 插件和生命周期绑定后,用户可以配置插件和插件目标的参数,进一步刁征插件目标所执行的任务,以满足项目需求,几乎所有的Maven插件都有一些参数。
- 用户可以通过命令行或者POM来配置插件参数,注意,命令行和POM配置的参数的名称一般都不一样。就需要查看插件的信息,下面有介绍。
- 配置之前需要查看插件有哪些参数可以配置,配置参数的意义。
a.命令行插件配置
- 很多插件参数都支持命令行配置。但不是所有。
- 在Maven命令中使用-D参数,并伴随一个key=value的形式来配置插件目标参数。
案例
maven-surefire-plugin提供了一个maven.test.skip的命令行参数(在pom中参数为skip),当其值为true时会跳过执行测试。
$mvn install -Dmaven.test.skip=true
b.全局配置
- 对于参数很少改变的配置应该配置在pom中。
- 对插件的配置有全局配置和对插件目标的配置。全局配置就是所有基于该插件目标的任务,都会使用这些配置。对插件目标配置就只是对该目标的任务执行该配置。
<build> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.1</version> <configuration> 该插件的整体配置,各个目标均使用该配置 <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
- 配置maven-compiler-plugin告诉它编译java1.8版本的源文件,生成与JVM1.8兼容的字节码文件。
- 配置之前查看插件有哪些全局配置参数参数配置。
- 局配置在plugin下面的configuration
- 这样不管绑定到compile阶段的maven-compiler-plugin:compile任务,还是绑定到testCompiler阶段maven-compiler-plugin:testCompiler任务,就都是用该配置。
c.局部配置(任务配置)
为插件的某个目标配置参数,配置在plugin/executions/execution下面的configuration
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <executions> <execution> <id>my-compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </execution> </executions> </plugin>
d.插件解析机制
与依赖构件一样,插件构件同样基于坐标存储在Maven仓库中。不同于依赖配置远程仓库使用的repotitories及其repository子元素,插件的远程仓库使用pluginRepositories和pluginRepositoryp配置,其他配置与依赖配置远程仓库一致