Maven专题3——生命周期与插件
三套生命周期
Maven有3套相互独立的生命周期,用户可以调用某个生命周期的阶段,而不会对其他生命周期产生影响。
每个生命周期包含一些有先后顺序的阶段,后面的阶段依赖于前面的阶段,意味着用户调用后面的生命周期阶段时,同一生命周期中前面的阶段也将被执行。
clean生命周期
- pre-clean
- clean
- post-clean
default生命周期
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile
- process-test-classes
- test
- prepare-package
- package
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install
- deploy
site生命周期
- pre-site
- site
- post-site
- site-deploy
命令行与生命周期
mvn clean
调用clean生命周期的clean
阶段;
mvn test
调用default生命周期的test
阶段
插件目标
Maven核心仅定义了抽象的生命周期,而具体的任务是交由具体的插件完成的。
每个目标通常对应了一个功能,插件目标常见的写法如:
dependency:tree
compiler:compile
surefire:test
冒号前面是插件前缀,冒号后面是插件目标。
插件绑定
Maven通过将生命周期的具体阶段与插件的目标绑定,完成具体的构建任务。
内置绑定关系
Maven核心为一些主要的生命阶段内置绑定了一些插件的目标,这就是为什么我们可以执行很多mvn
命令而无需指定具体的插件。
- 下表中的
default
生命周期以packaging
元素为jar
类型为例:
生命周期 | 阶段 | 插件目标 |
---|---|---|
clean | clean | maven-clean-plugin:clean |
site | site | maven-site-plugin:site |
site | site-deploy | maven-site-plugin:deploy |
default | process-resources | maven-resources-plugin:resources |
default | compile | maven-compiler-plugin:compile |
default | process-test-resources | maven-resources-plugin:test-resources |
default | test-compile | maven-compiler-plugin:test-compile |
default | test | maven-surefire-plugin:test |
default | package | maven-jar-plugin:jar |
default | install | maven-install-plugin:install |
default | deploy | maven-deploy-plugin:deploy |
因此我们在执行上述声明周期阶段时,缺省地就会执行相应插件的对应目标。
自定义绑定
在build.plugins.plugin
元素中,通过executions.execution
元素进行一个自定义绑定:
示例:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>x.y.z</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
<plugin>
</plugins>
</build>
其中:
- 每个
execution
元素配置执行一个任务, id
元素表示创建一个构建任务,给任务指定一个名称phase
元素将该任务绑定到具体的生命周期阶段,如上例中的default
生命周期的verify
阶段。下文将介绍该元素何时是可选的。goals
元素配置在该阶段要执行的插件目标,如上例中的jar-no-fork
插件的默认绑定
很多插件在实现时,默认进行了绑定,通过maven-help-plugin
插件可以查看:
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:x.y.z -Ddetail
其中jar-no-fork
目标相关的部分描述如下:
source:jar-no-fork
Description: This goal bundles all the sources into a jar archive. This
goal functions the same as the jar goal but does not fork the build and is
suitable for attaching to the build lifecycle.
Implementation: org.apache.maven.plugin.source.SourceJarNoForkMojo
Language: java
Bound to phase: package
该命令会显示指定插件的所有目标和具体的绑定。每个目标中的Bound to phase
就是该插件目标的默认绑定。
有了默认绑定,在自定义插件的绑定时,如果不指定phase
元素,就会在默认绑定的阶段执行对应的目标。
插件配置
命令行配置
一些插件的目标参数支持命令行配置:
mvn clean install -Dmaven.test.skip=true
maven-surefire-plugin提供了maven.test.skip
参数,-D
是Java自带的,用来通过命令行设置Java系统属性,Maven重用了该参数,可以用来配置插件的参数。
POM配置
POM中配置插件通过在插件配置中增加configuration
元素实现,该配置是对插件进行的全局配置,与命令行参数只对具体构建任务有效不同。
示例:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>x.y.z</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
<plugin>
</plugins>
</build>
也可以给具体的插件目标进行配置,具体是在execution
元素中添加configuration
元素,此时只对具体的插件目标生效。
获取插件信息
maven-help-plugin插件
使用目标前缀描述插件,如下,compiler
是maven-compiler-plugin
的目标前缀:
mvn help:describe -Dplugin=compiler
如果想查看具体目标的描述:
mvn help:describe -Dplugin=compiler -Dgoal=compile
如果想查看更详细的描述,可以加上-Ddetail
参数。
插件参数与用户属性
通过help插件可以描述插件的详细信息,详细信息中包含了插件的参数。
surefire:test
Description: Run tests using Surefire.
Implementation: org.apache.maven.plugin.surefire.SurefirePlugin
Language: java
Bound to phase: test
Available parameters:
...
skip (Default: false)
User property: maven.test.skip
Set this to 'true' to bypass unit tests entirely. Its use is NOT
RECOMMENDED, especially if you enable it using the 'maven.test.skip'
property, because maven.test.skip disables both running the tests and
compiling the tests. Consider using the skipTests parameter instead.
...
如该例中的skip
参数,用来跳过测试。然而实际在命令行中使用时,需要关注的是User property
属性,其中指定了用户实际使用时的键。
不是每个参数都有User property
属性,此时这些插件参数只能通过POM进行配置。
在线插件介绍
http://maven.apache.org/plugins/index.html
http://mojo.codehause.org/plugins.html
插件前缀
有的插件目标与具体的生命周期阶段绑定,通过命令行mvn
命令激活具体的生命周期阶段,即可执行绑定的插件目标。
有些插件目标并不适合绑定于具体的生命周期,Maven还支持直接从命令行调用插件命令:
mvn help:describe -Dplugin=compiler
mvn dependency:tree
它们分别对应了:
mvn org.apache.maven.plugins:maven-help-plugin:2.1:describe -Dplugin=compiler
mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:tree
这里就引出了插件前缀这个概念,
help
是maven-help-plugin
的前缀,dependency
是maven-dependency-plugin
的前缀。
插件前缀与groupId:artifactId
是一一对应的,这种对应关系存储在仓库元数据中
http://repo1.maven.org/maven2/org/apache/maven/plugins
http://repository.codehaus.org/org/codehaus/mojo
下的maven-metadata.xml中, 列出了各个已定义的插件与前缀对应关系,这样,我们在命令行中就可以使用插件前缀来指代具体的插件了。
插件默认的groupId
对于Maven官方插件(groupId
为org.apache.maven.plugins
),在POM中进行配置时可以省略groupId
这一行的配置。
插件版本的解析
Maven在超级POM中为所有核心插件设定了版本,超级POM是所有Maven项目的父POM,所有项目都继承这个超级父POM的配置。
因此,即使用户不加任何配置,核心插件的版本也已经确定了。
如果用户使用某个插件时没有指定版本,而这个插件又不属于核心插件范畴,Maven会去检查所有仓库中可用的版本并作出选择。
Maven 3在没有声明插件的版本时,使用稳定的发行版而不是快照版,相对于Maven 2更加稳定。
推荐在使用Maven插件时显式指定插件版本,避免不同构建时间存在使用不同的插件而带来构建不一致的问题。
Maven专题3——生命周期与插件的更多相关文章
- Maven整理笔记の生命周期和插件
项目构建的生命周期,其实软件开发人员每天都在干这个事,即项目清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等,可以说几乎所有项目的构建都可以映射到这样一个生命周期上. Maven的插件 ...
- 项目构建之maven篇:6.生命周期与插件
项目生命周期 清理 初始化 编译 測试 打包 部署 三套生命周期 1.clean pre-clean 运行一些须要在clean之前完毕的工作 clean 移除全部上一次构建生成的文件 post-cle ...
- 05 Maven 生命周期和插件
Maven 生命周期和插件 除了坐标.依赖以及仓库之外, Maven 另外两个核心概念是生命周期和插件.在有关 Maven 的日常使用中,命令行的输入往往就对应了生命周期,如 mvn package ...
- (十二)Maven生命周期和插件
除了坐标.依赖以及仓库之外,Maven的另外两个核心概念是生命周期和插件.在有关Maven的日常使用中,命令行的输入往往就对应了生命周期,如mvn package就表示执行默认生命周期阶段packag ...
- maven生命周期和插件
maven生命周期和插件 生命周期 maven的生命周期有三套,互相独立.每个生命周期含有不同阶段,常用如下 clean 清理项目 pre-clean 执行清理前需要完成的工作 clean 清理上一次 ...
- maven详解之生命周期与插件
Maven是一个优秀的项目管理工具,它能够帮你管理编译.报告.文档等. Maven的生命周期: maven的生命周期是抽象的,它本身并不做任何的工作.实际的工作都交由"插件"来完成 ...
- Maven的生命周期和插件
首先解释下maven build等 Maven build是这个插件让你自己去配置执行目标的.Maven clean 清除上一次Maven执行的结果Maven generate-sources会根据p ...
- Maven生命周期和插件机制
Maven中的一个非常重要的概念是生命周期和插件,这篇文章重点介绍下Maven的生命周期. Maven的生命周期是抽象的,具体的功能是有具体的插件来完成的,Maven有相当多的功能插件,以至于Mave ...
- Maven学习(四)-- 生命周期和插件
标签(空格分隔): 学习笔记 Maven生命周期是抽象的,不做任何实际的工作,在Maven的设计中,实际的任务都交由插件来完成. 每个构件步骤都可以绑定一个或者多个插件行为,而且Maven为大多数构建 ...
随机推荐
- 利用system generator 生成vivado ip—以低通滤波器举例
前段时间自学了matlab和vivado联合推出的system generator工具,用来做数字信号处理,十分好用且使开发更便捷,下面举个例子来供大家一起学习下. 首先打开matlab命令行,输入s ...
- MobSF移动安全扫描平台环境搭建与试用
MobSF简介 MobSF(Mobile-Security-Framework)是一种开源自动化的移动应用程序(Android / iOS / Windows)安全测试框架,能够执行静态,动态和恶意软 ...
- xv6学习笔记(3):中断处理和系统调用
xv6学习笔记(3):中断处理和系统调用 1. tvinit函数 这个函数位于main函数内 表明了就是设置idt表 void tvinit(void) { int i; for(i = 0; i & ...
- SQL 练习15
检索" 01 "课程分数小于 60,按分数降序排列的学生信息 SELECT Student.* ,SC.score from Student,SC WHERE sc.cid = ' ...
- NOIP 模拟 $21\; \rm Game$
题解 考试的时候遇到了这个题,没多想,直接打了优先队列,但没想到分差竟然不是绝对值,自闭了. 正解: 值域很小,所以我们开个桶,维护当前最大值. 如果新加入的值大于最大值,那么它肯定直接被下一个人选走 ...
- NOIP 模拟 10 考试总结
T1 一道很妙的题,打暴力分也很多,但是考试的时候忘开 long long 了. 题解 T2 一道挺水的题,不过...(打挂了) 题解 T3 此题甚妙,转化真多,不过对思维是一个非常大的扩展 题解 考 ...
- Object 类中的主要结构
== 操作符与equals 方法 == 操作符 equals 方法 重写equals() 方法的 toString() 方法
- lock学习篇(上)
why? 当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待. 但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候, ...
- uwp 基础知识
(TitleId,DiaplayName,args,LogoUri,size); Obj.VisualElements.ShowNameOnSquare150x150Logo = true; if ( ...
- 【C#】 Stopwatch详解
Stopwatch的命名空间是using System.Diagnostics; 1 namespace System.Diagnostics 2 { 3 // 4 // 摘要: 5 // 提供一组方 ...