Maven生命周期小记
1、Maven生命周期是为了所有的构建过程进行抽象和统一。Maven从大量的项目和构建工具中学习和反思,总结了一套高度完善、易扩展的生命周期。这个生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。
2、Maven三套独立的生命周期
clean生命周期,包含三个阶段
1)pre-clean执行一些清理前需要完成的工作
2)clean清理上次构建的文件
3)post-clean执行一些清理后需要完成的工作
default生命周期
validate
initialize
generate-sources
process-sources处理主项目资源文件,对src/main/resources目录内容进行变量替换以后复制到项目输出的主目录
generate-resources
process-resources
compile编译项目的主源码,编译src/main/java目录下的java文件至项目输出的主目录
process-classes
genarate-test-sources
process-test-sources处理测试资源文件
genarate-test-resources
process-test-resources
test-compile编译项目测试代码
process-test-classes
test使用单元测试框架运行测试,测试代码不会被打包和部署
prepare-package
package接受编译好的代码,打包成可发布的格式,如JAR、WAR
pre-integration-test
integration-test
post-integration-test
verify
intall将包安装到Maven本地库
deploy将最终包复制到远程仓库
site生命周期
pre-site执行一些生成项目站点之前的工作
site生成项目站点文档
post-site执行一些生成项目站点之后需要完成的工作
site-deploy将生成的站点发布到服务器上
3、插件目标
对于Maven插件本身为了能够复用代码一个插件往往能执行很多个功能。这些功能聚集在一个插件里,每个功能就是插件的一个目标。
4、插件绑定
Maven的生命周期是与插件绑定的,用以完成实际的构建任务。具体而言,是生命周期阶段和插件目标的相互绑定,以完成某个具体的构建任务。例如项目编译这一任务,它对应了default生命周期的compile这一阶段,而maven-compiler-plugin这一插件的compile目标能够完成该任务。因此将它们绑定。
5、内置绑定
clean生命周期阶段与插件目标的绑定关系
生命周期阶段 | 插件目标 |
---|---|
pre-clean | |
clean | maven-clean-plugin:clean |
post-clean |
site生命周期阶段与插件目标的绑定关系
生命周期阶段 | 插件目标 |
---|---|
pre-site | |
site | maven-site-plugin:site |
post-site | |
site-deploy | maven-site-plugin:deploy |
default生命周期与内置插件绑定关系及具体任务(打包类型: jar)
生命周期阶段 | 插件目标 | 执行任务 |
---|---|---|
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 | 将项目输出构件部署到远程仓库 |
注意:以上只列出了拥有插件绑定关系的阶段,default生命周期还有很多其他阶段,默认它们没有绑定任何插件,因此也没有任何实际行为。
6、自定义绑定
除了内置绑定以外,用户还能自己选择将某个插件目标绑定到生命周期的某个阶段上。一个常用的例子是创建项目的源码JAR包。我们使用maven-source-plugin插件完成我们的任务,它的jar-no-fork目标能将主代码打成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>
executions下的每个execution子元素可以用来配置执行一个任务。该例子中配置了一个ID为attach-sources任务,通过phase配置,将其绑定到verify生命周期阶段,再通过goal配置指定的插件目标。最后运行以下命令:
mvn verify
注意:有时候即使不通过phase元素配置生命周期阶段,插件目标也能绑定到生命周期阶段。原因是:很多插件的目标在编写时已经定义了默认的绑定阶段。可以使用maven-help-plugin查看插件详细信息。了解插件的默认绑定阶段。运行如下命令:
mvn help:describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-source-plugin -Dversion=2.1. -Ddetail
输出如下:
source:test-jar-no-fork
Description: This goal bundles all the test sources into a jar archive.
This goal functions the same as the test-jar goal but does not fork the
build, and is suitable for attaching to the build lifecycle.
Implementation: org.apache.maven.plugin.source.TestSourceJarNoForkMojo
Language: java
Bound to phase: package Available parameters: archive
The archive configuration to use. See Maven Archiver Reference.
这里关心的是Bound to phase: package,表示该目标表默认绑定到的生命周期阶段,这里是package。也就是说如果用户配置使用jar-no-fork目标的时候,如果不指定phase参数,该目标默认昂定到package阶段。
7、命令行插件配置
用户可以在Maven命令中使用-D参数,并伴随一个参数键=参数的形式来配置插件目标参数。例如:
mvn install -Dmaven.test.skip=true
参数-D是java自带的,其功能是通过命令行设置一个java系统属性,maven简单的重用了该参数。
8、在线插件信息
详情了解:http://maven.apache.org/plugins/index.html
下载地址:http://repo1.maven.org/maven2/org/apache/maven/plugins/
9、目标前缀
完整命令:
mvn org.apache.maven.plugins:maven-help-plugin:2.1:describe -Dplugin=compiler
采用目标前缀:
mvn help:describe -Dplugin=compiler
help是maven-help-plugin的目标前缀,目标前缀使命令更加简洁明了。
10、 插件仓库
Maven会区别对待依赖的远程仓库和插件远程仓库,不同于repositories及其子元素repository插件仓库使用pluginRepositories和pluginRepository配置。例如:
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://repo1.maven.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
除了pluginRepositories和pluginRepository外其余子元素所表达的含义和远程仓库配置完全一样。
11、解析groupId、插件版本、artifactId
1)使用目标前缀时groupId会自动用默认的org.apache.maven.plugins补全。
2)如果没有指定版本信息,会根据解析maven-metadata.xml,Maven2中会被解析至latest,Maven3中使用release。
3)如果setting.xml文件有配置如下配置,Maven就不仅仅会检查org/apache/maven/plugins/maven-metadata.xml和org/codehaus/mojo/maven-metadata.xml,还会检查com/your/plugins/maven-metadata.xml。这样就能得到完整的插件坐标,如果三个文件没有记录该插件的前缀,则报错。
<pluginGroups>
<pluginGroup>com.your.plugins</pluginGroup>
</pluginGroups>
Maven生命周期小记的更多相关文章
- Maven实战:Maven生命周期
前言 之前有写过一篇文章Maven实战,介绍了Maven的一些基本概念,以及对于一个初学者而言的Maven基础知识,当时在我看来掌握了这些基本是够用的. 随着工作的深入,越来越感觉对于Maven的理解 ...
- (十二)Maven生命周期和插件
除了坐标.依赖以及仓库之外,Maven的另外两个核心概念是生命周期和插件.在有关Maven的日常使用中,命令行的输入往往就对应了生命周期,如mvn package就表示执行默认生命周期阶段packag ...
- maven权威指南学习笔记(四)—— maven生命周期(lifecycle)
定义: 生命周期是包含在一个项目构建中的一系列有序的阶段 举个例子来说就是maven 对一个工程进行: 验证(validate) -- 编译源码(compile) -- 编译测试源码(test-com ...
- maven生命周期和插件
maven生命周期和插件 生命周期 maven的生命周期有三套,互相独立.每个生命周期含有不同阶段,常用如下 clean 清理项目 pre-clean 执行清理前需要完成的工作 clean 清理上一次 ...
- [maven] 生命周期和插件
maven生命周期和插件 生命周期 maven的生命周期有三套,互相独立.每个生命周期含有不同阶段,常用如下 clean 清理项目 pre-clean 执行清理前需要完成的工作 clean 清理上一次 ...
- maven系列(3)-maven生命周期的介绍
1. 概述 Maven有三套相互独立的生命周期,请注意这里说的是"三套",而且"相互独立",初学者容易将Maven的生命周期看成一个整体,其实不然.这三套生命周 ...
- Java-Maven(三):Maven坐标、Maven仓库、Maven生命周期
之前通过学习对maven命令有了部分了解,但是只是知道maven是用来做什么.但到目前位置还不足以全面的了解maven,为更全面的了解maven,需要学习以下几个概念:Maven坐标.Maven仓库. ...
- nexus私服搭建及maven生命周期
一.maven找库流程 从流程上看创建nexus私服,能够优化流程,而且更加快速 二.nexus下载.安装 1.nexus下载地址 https://sonatype-download.global.s ...
- 05 Maven 生命周期和插件
Maven 生命周期和插件 除了坐标.依赖以及仓库之外, Maven 另外两个核心概念是生命周期和插件.在有关 Maven 的日常使用中,命令行的输入往往就对应了生命周期,如 mvn package ...
随机推荐
- Unity 重要基础知识点
这是两个月前的学习记录,发出来了下,如果有误欢迎大家指出: 脚本生命周期 //每当脚本被加载时调用一次 // 1. 在Awake中做一些初始化操作 void Awake(){ //初始化publi ...
- 关于 bind 你可能需要了解的知识点以及使用场景
不看不知道,一看吓一跳,已经整整一个月没有更新 underscore 源码解读系列文章了.前面我们已经完成了 Object ,Array,Collection 上的扩展方法的源码剖析,本文开始来解读 ...
- .NET跨平台之旅:成功将示例站点升级至ASP.NET Core RC2
ASP.NET Core RC2 终于发布了( Announcing ASP.NET Core RC2 ).为了庆祝这次发布,我们将运行在 Ubuntu 服务器上的示例站点 about.cnblogs ...
- Java控制图片按比例缩放- (注意内存释放)
package mytiny.com.common; import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;im ...
- 一个python的邮件发送脚本,自动,定时,可以附件发送,抄送,附有说明文件
#!/bin/env python # -*- coding: utf-8 -*- import datetime import smtplib import os,sys from email.mi ...
- 冰冻三尺非一日之寒--js dom
1. 写页面是觉得丑 float,clear:both,margin,padding position: left: 网 ...
- iTestSharp的简单应用
前言 最近公司某项目要针对一些信息基础表绘画成表格的形式然后生成pdf文件,在网上寻找到iTestSharp发现此类库很强大,虽然园子里已经有很多大牛写了关于此插件的使用方法,但是自己也想写一写,把自 ...
- 北京培训记day4
智商题QAQ-- T1:求>=n的最小素数,n<=10^18 暴力枚举n-n+100,miller-rabin筛法 T2:给定一个01矩阵,每次选择一个1并将(x,y)到(1,1)颜色反转 ...
- Django中 如何修改models字段的默认值
场景描述: 在建表的时候,新闻表的内容简介字段,给的默认值是可以为空的,但是没有设置默认值为blank,那么,这种情况下,对于只有标题,没有内容简介的新闻来讲,发布之后,前端显示的内容简介位置是non ...
- Automated Memory Analysis
catalogue . 静态分析.动态分析.内存镜像分析对比 . Memory Analysis Approach . volatility: An advanced memory forensics ...