Maven 的插件和生命周期的绑定
一、Maven 的生命周期
Maven 的生命周期是对所有的构建过程进行抽象和统一。Maven 的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,生命周期只是定义了一系列的阶段,并确定这些阶段的执行顺序。
生命周期( Lifecycle ) |
阶段( Phase ) |
目标( Goa l) |
clean |
clean |
maven-clean-plugin:clean |
default |
process-resources |
maven-resources-plugin:resources |
compile |
maven-compiler-plugin:compile |
|
generate-test-resources |
maven-resources-plugin:testResouces |
|
test-compile |
maven-compiler-plugin:testCompile |
|
test |
maven-surefire-plugin:test |
|
package |
打包类型是jar时:maven-jar-plugin:jar; 打包类型是war时:maven-war-plugin:war |
|
install |
maven-install-plugin:install |
|
deploy |
maven-deploy-plugin:deploy |
|
site |
site |
maven-site-plugin:site |
site-deploy |
maven-site-plugin:deploy |
二、 Maven 插件和生命周期的绑定
Maven 的插件位于 ${REPOSITORY_HOME}\org\apache\maven\plugins 。用户和 Maven 最直接的交互方式就是调用这些生命周期阶段,而在执行这些阶段时,实际的任务主要由插件来完成。
- 以 Phase 为目标的构建
以 phase 为目标进行构建是最常见的,如我们平时经常执行的 mvn compile,mvn test,mvn package...等等, compile, test, package 都是 maven 生命周期( lifecycle )里的 phase,通过 mvn 命令,你可以指定一次构建执行到哪一个阶段,在执行过程中,所有经历到的执行阶段( phase )上绑定的 goal 都将得到执行。例如,对于一个jar包应用,当执行mvn package命令时,maven 从 validate 阶段一个阶段到一个阶段的执行,在执行到 compile 阶段时,compiler 插件的 compile goal 会被执行,因为这个 goal 是绑定在compile阶段( phase )上的。这一点可从其对应的 mojo 类上得知:
再比如经常使用的打包插件 shade,它的 goal 是绑定到package阶段的,这样,使用 mvn package 进行打包时都会执行 shade 的。 - 以 Goal 为目标的构建
虽然以 phase 为目标的构建最常见,但是有时候我们会发现,一些插件的 goal 并不适合绑定到任何阶段( phase )上,或者是这些 goal 往往是单独执行,不需要同某个阶段( phase )绑定在一起,比如 jetty(6.1.26)插件,它的 goal 都是将打包或未打包的工程部署到 jetty 里然后启动 jetty 容器的,多数情况下,人们都是独立运行这些goal的,比如:人们希望当键入 mvn jetty:run 后,工程就能完成编译后启动 jetty。而 jetty 插件也确实是这样做的,它的 run goal 的 mojo 是这样声明的:
其中 @execute phase="test-compile" 指明 jetty:run 这一 goal 会促使 maven 先 build 到 test-compile 阶段,再执行这个 goal。同样,对于 jetty:run-war 这个goal 则要求先 build 到 package 阶段再执行该 goal。
而另外一个例子是exec插件的exec:java.
这个 goal 也声明了 execute 的 phase,但却是 validate,这样,如果代码没有编译,执行这个 goal 就会出错,所以多数情况下,人们总是使用下面的方式执行的:mvn clean compile exec:java
Maven 支持这种方式是因为有些任务不适合绑定到生命周期上。
在命令行调用插件的格式如下:
mvn groupId:artifactId:version:goal
其中 groupId、artifactId、version 共同表示了插件的坐标,goal 则表示插件目标的方法。
但我们看到很多执行插件目标的格式与之并不相符,例如文章开头的 mvn jetty:run,jetty并不是 groupId、artifactId或version 而是插件的前缀,这就有了第二种调用插件的格式:
mvn 前缀:goalMaven 通过查询插件仓库的元数据才得知插件前缀对应插件的 groupId、artifactId,而如果插件是Maven的核心插件则在超级POM中已经定义了插件的版本,如果不是核心插件,则默认取最新的release版本 。
Maven的插件仓库默认是 http://repo1.maven.org/maven2/org/apache/maven/plugins/ 和 http://repository.codehaus.org/org/codehaus/mojo/,相应的查询插件仓库元数据时会默认使用 org.apache.maven.plugins 和 org.codehaus.mojo 两个 groupId。但也可以通过配置 settings.xml 让Maven检查其他 groupId 上的插件仓库元数据,如:- <settings>
- <pluginGroups>
- <pluginGroup>com.your.plugins</pluginGroup>
- </pluginGroups>
- </settings>
这样配置后,Maven就不只检查 org/apache/maven/plugins/maven-metadata.xml 和 org/codehaus/mojo/maven-metadata.xml,还会检查com/your/plugins/maven-metadata.xml
- <settings>
- 相关配置实例
如果我们想在 test 阶段只执行单元测试,而在 integration-test 阶段进行集成测试的话,可以如下配置:- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <version>2.10</version>
- <configuration>
- <skip>true</skip>
- </configuration>
- <executions>
- <execution>
- <id>run-test</id>
- <phase>test</phase>
- <goals>
- <goal>test</goal>
- </goals>
- <configuration>
- <skip>false</skip>
- <includes>
- <include>**/unit/**/*.java</include>
- </includes>
- </configuration>
- </execution>
- <execution>
- <id>run-integration-test</id>
- <phase>integration-test</phase>
- <goals>
- <goal>test</goal>
- </goals>
- <configuration>
- <skip>false</skip>
- <includes>
- <include>**/integration/**/*.java</include>
- </includes>
- </configuration>
- </execution>
- </executions>
- </plugin>
其中红色背景的 <skip>true</skip> 是为了让 Maven 的默认绑定(test阶段<-> maven-surefire-plugin:test 插件目标) 无效 (其实绑定仍然有效,只是执行时忽略执行罢了),而后面的 executions 块内容则增加了两个绑定,分别将 maven-surefire-plugin:test 插件目标绑定到 test 阶段和 integration-test 阶段,只是配置不一样了,分别执行unit包和integration包下的测试类。
- <plugin>
三、参考文档
- Maven lifecycle
- Maven plugins
- maven的生命周期和插件 - 御云
- 是goal还是phase?Maven插件(plugin)goal的执行与生命周期(lifecycle)phase的关系
Maven 的插件和生命周期的绑定的更多相关文章
- maven的仓库、生命周期与插件
一.仓库 统一存储所有Maven项目共享的构建的位置就是仓库. 仓库分为本地仓库和远程仓库.远程仓库又分为中央仓库(中央仓库是Maven核心自带的远程仓库),伺服(另一种特殊的远程仓库,为节省宽带和时 ...
- maven详解之生命周期与插件
Maven是一个优秀的项目管理工具,它能够帮你管理编译.报告.文档等. Maven的生命周期: maven的生命周期是抽象的,它本身并不做任何的工作.实际的工作都交由"插件"来完成 ...
- maven插件的生命周期的详细说明(两)
插件配置 定义解释:插件目标 当我们了解了maven插件之后.我们发现假设为每个功能编写一个独立的插件显然是不可取的,由于这些任务背后有非常多能够复用的代码.因此,把这些功能聚集在一个插件里,每个功能 ...
- maven的核心概念——生命周期
第十一章生命周期 11.1 什么是Maven的生命周期 ●Maven生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven就可以自动化的执行构建命令了. ●Maven有三套相互独立的生命周期, ...
- Service的生命周期&Service绑定方法
服务的生命周期: 一.采用start的方式开启服务 生命周期如下: 开启服务: onCreate()--> onStartCommand() (onStart()过时了)---> onDe ...
- maven第7章生命周期和插件
maven插件用到哪些思想? 7.7 从命令行调用插件 目标前缀和插件前缀是一个意思. 在本地搭建maven环境,熟悉maven的环境.
- maven build的常用生命周期
常用的maven build goals: validate - validate the project is correct and all necessary information is av ...
- Maven入门 项目的生命周期&pom.xml配置&仓库
- Maven 学习总结 (二) 之 生命周期与插件
五.生命周期与插件 1.Maven有三套独立的生命周期:clean.default和site. clean生命周期的目的是清理项目,default生命周期的目的是构建项目,site生命周期的目的是建立 ...
随机推荐
- animate对颜色设置不起作用
今天了解了一下stop的使用方法,但是实例中加入color:red的时候,动画效果没有实现,具体实例如下: http://jsbin.com/fezaroyene/edit?html,js,outpu ...
- IO流 FileOutputSteam在fos.txt写出hello
package cn.idcast2; import java.io.FileNotFoundException; import java.io.FileOutputStream; import ja ...
- Table
Table tb = new Table();TableRow r = new TableRow(); TableCell c = new TableCell();c.Text = "Sta ...
- jsp页面中引用其他页面的方法
初看这个标题....大家的感觉一定是好2啊.....博主一定要说jsp的动态引用(jsp:include)和静态引用(@include)了.介绍这两者区别的文章已经烂大街了..一搜一大把..博主竟然还 ...
- JavaScript常用技术总结!~~
//如果当前窗口不是最外层窗口,把最外层窗口链接改成当前窗口 if (window != top) top.location.href = location.href; //value值移入消失 $( ...
- php.ini 安全配置
(1) 打开php的安全模式 php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/ ...
- sqlplus连接oracle失败分析和解决
背景: 多台Linux服务器需要安装Oracle客户端,实现和Oracle数据库连接做业务处理. 安装完第一台后,直接将安装的目录压缩并复制到其他几台机器上,启动sqlplus连接数据库时,一直提示输 ...
- QuickSort 快速排序 基于伪代码实现
本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4737492.html 伪代码 quicksort(A, lo, hi) if lo < hi p ...
- word20161211
H.323 half-duplex / 半双工 handle count / 句柄数 handshaking / 握手 Hardware Compatibility List, HCL / 硬件兼容性 ...
- destoon去掉会员注册email验证
修改文件: /module/member/member.class.php 删除61行: //if(!is_email($email)) return $this->_($L['member_e ...