生命周期
maven包含三套生命周期,每套生命周期中包含多个阶段,每套生命周期内的阶段有前后依赖关系,但是不同生命周期的阶段之间是相互独立的:
- clean:清理项目(主要是删除target目录下的内容)
- default:构建项目,包含编译、测试、安装(把编译出来的构建拷贝到本地仓库)、部署(拷贝到远程仓库)等几个主要阶段(详细参见附1default生命周期)
- site:建立和发布项目站点,Maven可以基于POM所包含的信息自动生成一个友好的站点,方便团队交流。这个对于团队开发比较有帮助,个人开发很少会使用。
插件
1,目标
maven只是定义了抽象的生命周期,具体的功能实现还是需要交由插件来完成(插件也是maven的一种构件)
每个插件都会包含多个目标,每个目标对应一个功能,这些可以通过查看插件相关信息来获取,写法:插件前缀:该插件目标。例如compiler:compile表示插件maven-compiler-plugin的compile目标。
生命周期与插件的目标相互绑定,来完成某个具体的构建任务。
2,插件内置绑定
为了能让用户几乎不用任何配置就能构建maven项目,maven在核心为一些主要的生命周期阶段绑定了很多插件的目标。如下分别对应三套生命周期的内置插件绑定。
3,自定义绑定
用户可以在pom.xml文件中配置将某个插件目标绑定到生命周期的某个阶段上(一般内置绑定已经够用),这种配置方法的常见的例子是拷贝项目的依赖包到target/lib/目录下,创建项目的源码jar包,内置的插件绑定关系中并没有涉及这些任务,因此需要用户自行配置。
例如想在verify阶段将项目的主代码打包成jar文件,就可以如下配置
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.1</version> <executions> <execution> <id>attach-source</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin>
例如想在打包阶段拷贝项目的依赖包(主要用于构建可执行的jar包),可以如下配置
<plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- ${project.build.directory}为Maven内置变量,缺省为target --> <outputDirectory>${project.build.directory}/lib</outputDirectory> <!-- 表示是否不包含间接依赖的包 --> <excludeTransitive>false</excludeTransitive> <!-- 表示复制的jar文件去掉版本信息 --> <stripVersion>true</stripVersion> </configuration> </execution> </executions> </plugin>
说明:
- 自定义绑定是在<execution/>标签中配置的
- <id/>标签配置自定义绑定任务的唯一ID
- <phase/>标签配置生命周期的阶段
- <goals/>标签配置插件的目标
- <configuration/>标签与<goals/>标签同级配置插件目标的参数,也可以和插件的坐标同级来配置插件的全局配置
4,命令行中执行
几种常见的命令行执行内置绑定的方法
- mvn clean:该命令调用clean生命周期的clean阶段
- mvn test:该命令调用default生命周期的test阶段(即从validate、initialize一直到test阶段)
- mvn clean install:该命令调用clean生命周期的clean阶段和default生命周期的install阶段(即从validate、initialize一直到install阶段)
- mvn clean deploy sit-deploy:谇命令调用命令调用clean生命周期的clean阶段、default生命周期的deploy阶段以及site生命周期的site-deploy阶段。
还可以直接用[插件前缀:插件目标]的方式来调用,如下
- mvn dependency:list:查看项目依赖的构件列表
5,eclipse中配置执行maven任务
在eclipse中右键点击maven项目名找到run里面会有maven的一些执行任务,如下所示
如果这些默认的执行任务不能满足要求,也可以选中上图中的第2个Maven build...,会出现如下配置,或在在goals中填入相应的任务即可,格式为:插件前缀:插件目标(例如compiler:testCompile),如果有参数也可以在下图第二个红框中添加,最后点击Run按钮即可。
6,插件仓库
与依赖构件一样,插件构件同样基于坐标存储在maven仓库中,不过插件仓库是单独仓库,在配置文件的<pluginRepositories/>标签中配置,如下
<pluginRepositories> <pluginRepository> <id>central</id> <name>Maven Plugin Repository</name> <url>https://repo1.maven.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </pluginRepository> </pluginRepositories>
另外,如果在pom中配置的插件是maven官方插件的话,在<plugin/>配置中可以省略groupId,这是maven默认插件groupId是org.apache.maven.plugins,这就是maven官方插件的groupId。
7,插件信息查询
在命令行下进入到项目pom.xml所在目录,执行命令:mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddeftail,其中粗体部分是需要查询的插件的坐标,需要在pom.xml中已经配置才可以查询到
还可以在线查询,maven官方插件列表在http://maven.apache.org/plugins/index.html页面找到。
附
附1,defalut生命周期:
- validate
- 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 接受编译好的代码,打包成可发布的格式,如 JAR 。
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包安装至本地仓库,以让其它项目依赖。
- deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
附2,常用插件列表
插件名称 |
用途 |
来源 |
maven –clean -plugin |
清理项目 |
Apache |
maven –compile -plugin |
编译项目 |
Apache |
maven –deploy -plugin |
部署项目 |
Apache |
maven –install -plugin |
安装项目 |
Apache |
maven –resources -plugin |
处理资源文件 |
Apache |
maven –site -plugin |
生成站点 |
Apache |
maven –surefire -plugin |
执行测试 |
Apache |
maven –jar -plugin |
构建JAR项目 |
Apache |
maven –war -plugiin |
构建war项目 |
Apache |
maven –shade -plugin |
构建包含遗憾的JAR包 |
Apache |
maven –changelog -plugin |
生产版本控制变更报告 |
Apache |
maven –checkstyle -plugin |
生成checkStyle报告 |
Apache |
maven –javadoc –plugin |
生成JavaDoc文档 |
Apache |
maven –jxr –plugin |
生成源码交叉引用文档 |
Apache |
maven –pmd –plugin |
生成PMD报告 |
Apache |
maven –project –info -reports –plugin |
生成项目信息报告 |
Apache |
maven –surefire –plugin |
生成单元测试报告 |
Apache |
maven –antrun –plugin |
调用Ant任务 |
Apache |
maven -archetype –plugin |
基于Archetype生成项目骨架 |
Apache |
maven –assembly –plugin |
构建自定义格式的分布包 |
Apache |
maven –dependency –plugin |
依赖分析及控制 |
Apache |
maven –enforcer –plugin |
定义规则并强制要求遵守 |
Apache |
maven –pgp –plugin |
为项目构建生成PGP签名 |
Apache |
maven -invoke –plugin |
自动运行Maven项目构建并验证 |
Apache |
maven –release –plugin |
自动项目版本发布 |
Apache |
maven –scm –plugin |
集成版本控制系统 |
Apache |
maven –source –plugin |
生成源码包 |
Apache |
maven –eclipse –plugin |
生成Eclipse项目环境变量 |
Apache |
jboss –maven –plugin |
启动、停止Jboss,部署项目 |
Codehaus |
properties –maven –plugin |
从properties文件读写Maven属性 |
Codehaus |
sql –maven –plugin |
运行SQL脚本 |
Codehaus |
tomcat –maven –plugin |
启动、停止、部署项目 |
Codehaus |
versions –maven –plugin |
自动化批量更新POM版本 |
Codehaus |
cargo –maven –plugin |
启动/停止/配置各类Web容器自动化部署Web项目 |
Cargo |
jetty –maven –plugin |
集成jetty容器,实现快速开发测试 |
Eclipse |
maven –gae –plugin |
集成Google APP Engine |
Googlecode |
maven –android –plugin |
构建Android项目 |
Googlecode |
附3,参考
《maven实战》
http://juvenshun.iteye.com/blog/213959
http://www.cnblogs.com/tonychanleader/archive/2013/05/11/3072703.html